44 Commits

Author SHA1 Message Date
Seth b7281e0f04 docs: add session handoff (mac-app-launcher) 2026-04-29 12:19:24 -04:00
Seth 4172a30487 docs: update CLAUDE.md + DECISIONS.md for macOS .app launcher addition
CLAUDE.md: removed stale "(to be implemented per spec §5.5)" wording for
check-no-upstream-edits.sh (script is implemented and battle-tested), added
tests-impl/ to the dirs-list, expanded the guardrail description.

DECISIONS.md: appended the .app launcher decision (stub bundle synthesized
in brew formula def install — sethLabels-side fix, no upstream patch).
2026-04-29 12:19:20 -04:00
Seth f6c30f2fe8 test: move bats scratch dirs to repo-local .test-scratch/ (per global no-/tmp/ rule)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 12:03:57 -04:00
Seth 76a3cb798a docs: README.sethlabels.md — include upstream remote setup in build-from-source
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 12:03:49 -04:00
Seth 891cc7c1c8 docs: add session handoff (first-release) 2026-04-29 11:56:47 -04:00
Seth 2d049437ff docs: refresh CLAUDE.md to post-first-release phase 2026-04-29 11:54:35 -04:00
Seth 2108e2cf15 docs: changelog for 3.99-master618-seth1 2026-04-29 11:53:32 -04:00
Seth 8290870f06 docs: add README.sethlabels.md (fork entry point) 2026-04-29 11:43:28 -04:00
Seth 9b970804fc docs: add scripts/README.md (operator run guide) 2026-04-29 11:42:34 -04:00
Seth 2a789e30f8 fix: guard batch AppImage icon path with pre-flight check 2026-04-29 11:41:33 -04:00
Seth e619699660 chore: add xvfb to deps-debian.sh (required by build-appimages smoke tests)
build-appimages.sh T3/T4 smoke tests start Xvfb automatically when no
DISPLAY is set. Without xvfb in the deps array, a clean Debian/Ubuntu
host would pass the dep check but fail at smoke-test time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 11:39:10 -04:00
Seth f7e35652a9 fix: prune unused binary from each AppDir before linuxdeploy bundling
Previously cmake --install populated both AppDirs with both binaries,
causing the batch AppImage (57MB) to be larger than the GUI AppImage
(47MB). Add rm lines after the sanity-check block to strip the
unwanted binary from each AppDir before linuxdeploy runs.

Also prune the upstream GUI desktop files from the batch AppDir (they
reference Exec=glabels-qt which is now absent) and supply --icon-file
+ --icon-filename so --create-desktop-file resolves the icon lookup.
Both AppImages now contain only their respective binary (~33-34MB each).

Also document the QMAKE=/usr/bin/qmake6 workaround (Debian 13 Qt6
qmake discovery failure in linuxdeploy-plugin-qt).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 11:39:02 -04:00
Seth d5fb872518 feat: add build-appimages.sh with inline smoke tests T3, T4
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 11:14:58 -04:00
Seth 13d4047fe1 fix: guard rm -rf in build-deb.sh against empty BUILD_DIR 2026-04-29 10:50:10 -04:00
Seth 4f2de8a92c feat: add build-deb.sh with inline smoke tests T1, T2
Also fixes deps-debian.sh for Debian 13 (trixie): libqt6core6 was
renamed to libqt6core6t64; libgnubarcode-dev removed (not in Debian
13 repos, optional upstream dep).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 10:44:01 -04:00
Seth 34b72ca384 feat: add packaging metadata + initial changelog 2026-04-29 10:37:38 -04:00
Seth 4a0185df53 feat: add linuxdeploy.sh bootstrap (pinned per F9)
Bootstraps linuxdeploy (1-alpha-20251107-1) and linuxdeploy-plugin-qt
(1-alpha-20250213-1) to scripts/.cache/ on first run. Dual-mode:
sourceable (exports $LINUXDEPLOY_BIN / $LINUXDEPLOY_PLUGIN_QT_BIN) or
executable (prints paths). Pinned dated snapshots per spec §F9 — no
rolling continuous tag.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 10:34:01 -04:00
Seth cb2f687a6b feat: add deps-debian.sh (build-dep manifest + checker)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 10:28:55 -04:00
Seth 0631c55c0f fix: check-no-upstream-edits.sh aborts when upstream/master ref missing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 10:26:00 -04:00
Seth caee5291ff feat: add check-no-upstream-edits.sh + bats tests (enforces I1)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 10:22:18 -04:00
Seth 9cc418c68f feat: add compute-version.sh + bats tests
Emits <upstream-tag>-seth<N> to stdout. Pure logic, no side effects.
5/5 bats tests pass; output verified as 3.99-master618-seth1.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 10:18:12 -04:00
Seth 52096c0d63 chore: add packaging directory skeleton + .gitignore build patterns 2026-04-29 10:14:09 -04:00
Seth 33525a8c1d docs: add packaging implementation plan (12 tasks) 2026-04-29 10:11:29 -04:00
Seth da74709433 docs: add session handoff (spec-approved-pre-implementation)
Captures session state at the natural pause point: design spec
approved, no implementation started. Supersedes the scaffold-only
handoff (which described an empty-dir state).

Validated 80/100 by validate_handoff.py. The 4 file-not-found
warnings reference scripts/* that are intentionally unwritten —
they are the next session's deliverables per the spec.

Resume next session with writing-plans skill against the spec at
sethlabels-docs/specs/2026-04-29-packaging-design.md.
2026-04-29 10:00:59 -04:00
Seth d3e14c63c0 docs: refresh CLAUDE.md + IDEA.md for design-approved phase
Reflects state changes from this session:
- Phase moved from "ideation, no upstream pull" to "design-approved,
  pre-implementation"
- Repo confirmed live at git.sethpc.xyz/Seth/sethLabels (was TBD)
- Qt6 6.2 confirmed (was Qt5-or-Qt6 TBD)
- Target framing corrected: Debian-family generic + macOS via brew tap;
  steel141 is a build host, NOT the install target
- Strict-zero source-patch policy spelled out (replaces vague "keep
  diffs surgical")
- Versioning scheme noted (<upstream-tag>-seth<N>)
- Eventual-public flip on GitHub captured

Pointer to spec at sethlabels-docs/specs/2026-04-29-packaging-design.md
added to CLAUDE.md "Current State".
2026-04-29 09:55:07 -04:00
Seth 8e272c0bd8 docs: add packaging design spec + decision log
Captures the brainstormed design for sethLabels' packaging pipeline:
- Strict-zero source patches; all sethLabels content in NEW top-level dirs
- Linux artifacts: .deb (CPack-driven) + AppImage (linuxdeploy + Qt plugin),
  both built from upstream's existing install() rules
- macOS: Homebrew tap, build-from-source — no macOS CI, no signing,
  no Apple Developer ID
- Build infra: manual local builds during battle-test phase; shell
  scripts under scripts/ are the canonical recipe (CI YAML at the
  eventual public-flip on GitHub will call them verbatim)
- Versioning: <upstream-tag>-seth<N> for clear lineage + rebuild counter
- Package name: glabels-qt (matches binary, brew formula, command)

Spec at sethlabels-docs/specs/2026-04-29-packaging-design.md.
Decision log at DECISIONS.md.

No code introduced — design only. Plan-writing follows.
2026-04-29 09:37:56 -04:00
Seth 9dc6776bb4 chore: add sethLabels deployment-fork scaffold
Adds Seth's homelab convention files on top of upstream glabels-qt master:
CLAUDE.md (project instructions), IDEA.md (brief), DECISIONS.md (decision
log, empty), and the kickoff handoff under .claude/handoffs/. Appends a
clearly-marked sethLabels section to .gitignore for .backup/, the
GITEA_API.md symlink, .env files, and handoff drafts.

This is the only non-upstream commit on main. All preceding history is
authored by the glabels.org team (Jaye Evins et al.) and untouched.
Future upstream merges should fast-forward or rebase cleanly since the
scaffold lives in distinct files at repo root.

No source-code changes. License unchanged (GPL-3.0).
2026-04-29 09:04:54 -04:00
Jaye Evins d1ee78e58a Fix incorrect font sizes (#321)
Recently, when chasing the font size differences between the wayland and xcb Qt backends, I ended up normalizing on the wayland sizing when bypassing the backend's font metrics calculation (#272).  Unfortunately, the wayland backend was not rendering the font sizes correctly, and it was a mistake to duplicate its behavior. 

* Assume a virtual DPI of 72 pixels/in instead of 96 when compulting font size
  - Based on testing, this produces the correct font size
  - Updated reference labels.
* No longer need to scale fonts when importing glabels-3 files.
  - The glabels-3 font sizes were correct afterall!  (#306)
  - No longer need to compensate for scale factor in unit tests when importing glabels-3 files.
2026-03-27 15:47:46 -04:00
Jaye Evins 06675f8314 Create template style guide and minor updates to templates and docs (#314)
* Add style guide for creating product template submissions.
* Some updates to TODO.md.  (#270)
* Remove Meta nodes with deprecated product_url attributes.
2026-02-22 16:54:07 -05:00
Jaye Evins 226841fe38 Minor UI cleanup (#313)
* Adjust tab-order of widgets to follow a logical spatial order.  (#309)
* Remove default attribute from Print button in PrintView.  (#308)
2026-02-18 11:38:38 -05:00
Jaye Evins 6ad97b76dc Reconcile LINGUAS with #290. 2026-02-11 17:21:55 -05:00
Weblate (bot) 1220c04f37 Translations update from Fedora Weblate (#290)
* Translated using Weblate (Swedish)

Currently translated at 100.0% (107 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/sv/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sv/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.5% (624 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pt_BR/

* Translated using Weblate (Italian)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/it/

* Translated using Weblate (Estonian)

Currently translated at 0.9% (1 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/et/

* Translated using Weblate (Estonian)

Currently translated at 1.9% (13 of 669 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/et/

* Translated using Weblate (Indonesian)

Currently translated at 99.8% (666 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/id/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.6% (658 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pt_BR/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (107 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/id/

* Translated using Weblate (Greek)

Currently translated at 0.5% (4 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/el/

* Translated using Weblate (Dutch)

Currently translated at 98.5% (555 of 563 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/nl/

* Translated using Weblate (Danish)

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/da/

* Translated using Weblate (Czech)

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/cs/

* Translated using Weblate (Danish)

Currently translated at 73.0% (487 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/da/

* Translated using Weblate (Czech)

Currently translated at 54.8% (366 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/cs/

* Translated using Weblate (Hungarian)

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/hu/

* Translated using Weblate (Hungarian)

Currently translated at 63.8% (426 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/hu/

* Translated using Weblate (Romanian)

Currently translated at 30.8% (206 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ro/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 56.1% (316 of 563 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/nb_NO/

* Translated using Weblate (Chinese (Traditional) (zh_TW))

Currently translated at 26.2% (175 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/zh_TW/

* Translated using Weblate (Romanian)

Currently translated at 65.3% (436 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ro/

* Translated using Weblate (Slovenian)

Currently translated at 31.1% (208 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sl/

* Translated using Weblate (Portuguese)

Currently translated at 39.2% (221 of 563 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pt/

* Translated using Weblate (Serbian (Latin script))

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sr_Latn/

* Translated using Weblate (Russian)

Currently translated at 31.1% (208 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ru/

* Translated using Weblate (Greek)

Currently translated at 31.7% (212 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/el/

* Translated using Weblate (Catalan)

Currently translated at 21.2% (142 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ca/

* Translated using Weblate (English (United Kingdom))

Currently translated at 31.1% (208 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/en_GB/

* Translated using Weblate (Arabic)

Currently translated at 14.3% (96 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ar/

* Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 24.5% (164 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/zh_CN/

* Translated using Weblate (Serbian)

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sr/

* Translated using Weblate (Occitan)

Currently translated at 39.2% (221 of 563 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/oc/

* Translated using Weblate (Korean)

Currently translated at 19.1% (128 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ko/

* Translated using Weblate (Galician)

Currently translated at 9.2% (62 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/gl/

* Translated using Weblate (Finnish)

Currently translated at 24.2% (162 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/fi/

* Translated using Weblate (Esperanto)

Currently translated at 24.4% (163 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/eo/

* Translated using Weblate (Latvian)

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/lv/

* Translated using Weblate (Japanese)

Currently translated at 31.1% (208 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ja/

* Translated using Weblate (Bosnian)

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/bs/

* Translated using Weblate (Chinese (Hong Kong) (zh_HK))

Currently translated at 26.2% (175 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/zh_HK/

* Translated using Weblate (Turkish)

Currently translated at 31.3% (209 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/tr/

* Translated using Weblate (Slovak)

Currently translated at 33.7% (225 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sk/

* Translated using Weblate (Serbian)

Currently translated at 46.7% (50 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/sr/

* Translated using Weblate (Occitan)

Currently translated at 64.6% (364 of 563 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/oc/

* Translated using Weblate (Dutch)

Currently translated at 28.8% (30 of 104 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/nl/

* Translated using Weblate (Turkish)

Currently translated at 53.6% (358 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/tr/

* Translated using Weblate (Korean)

Currently translated at 40.6% (271 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ko/

* Translated using Weblate (Russian)

Currently translated at 29.9% (32 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/ru/

* Translated using Weblate (Latvian)

Currently translated at 59.9% (400 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/lv/

* Translated using Weblate (Arabic)

Currently translated at 27.8% (186 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ar/

* Translated using Weblate (Japanese)

Currently translated at 28.0% (30 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/ja/

* Translated using Weblate (Serbian)

Currently translated at 51.2% (342 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sr/

* Translated using Weblate (Catalan)

Currently translated at 46.3% (309 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ca/

* Translated using Weblate (Slovak)

Currently translated at 67.4% (450 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sk/

* Translated using Weblate (Bosnian)

Currently translated at 53.2% (355 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/bs/

* Translated using Weblate (Serbian (Latin script))

Currently translated at 46.7% (50 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/sr_Latn/

* Translated using Weblate (Greek)

Currently translated at 55.9% (373 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/el/

* Translated using Weblate (Esperanto)

Currently translated at 56.0% (374 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/eo/

* Translated using Weblate (Portuguese)

Currently translated at 48.0% (50 of 104 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/pt/

* Translated using Weblate (Slovenian)

Currently translated at 58.4% (390 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sl/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 14.4% (15 of 104 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/nb_NO/

* Translated using Weblate (Spanish)

Currently translated at 39.2% (42 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/es/

* Translated using Weblate (Turkish)

Currently translated at 29.9% (32 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/tr/

* Translated using Weblate (Finnish)

Currently translated at 54.1% (361 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/fi/

* Translated using Weblate (Occitan)

Currently translated at 47.1% (49 of 104 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/oc/

* Translated using Weblate (Romanian)

Currently translated at 27.1% (29 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/ro/

* Translated using Weblate (Russian)

Currently translated at 54.7% (365 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ru/

* Translated using Weblate (Slovenian)

Currently translated at 29.9% (32 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/sl/

* Translated using Weblate (Korean)

Currently translated at 4.6% (5 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/ko/

* Translated using Weblate (Portuguese)

Currently translated at 93.2% (525 of 563 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pt/

* Translated using Weblate (Portuguese)

Currently translated at 93.2% (525 of 563 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pt/

* Translated using Weblate (Slovak)

Currently translated at 15.8% (17 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/sk/

* Translated using Weblate (Serbian (Latin script))

Currently translated at 53.5% (357 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/sr_Latn/

* Translated using Weblate (Galician)

Currently translated at 26.9% (180 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/gl/

* Translated using Weblate (Latvian)

Currently translated at 46.7% (50 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/lv/

* Translated using Weblate (Japanese)

Currently translated at 55.0% (367 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/ja/

* Translated using Weblate (Chinese (Hong Kong) (zh_HK))

Currently translated at 54.1% (361 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/zh_HK/

* Translated using Weblate (Chinese (Traditional) (zh_TW))

Currently translated at 53.9% (360 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/zh_TW/

* Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 49.9% (333 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/zh_CN/

* Translated using Weblate (Spanish)

Currently translated at 40.1% (43 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/es/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/id/

* Translated using Weblate (Spanish)

Currently translated at 64.7% (432 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/es/

* Translated using Weblate (German)

Currently translated at 100.0% (107 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/de/

* Translated using Weblate (Danish)

Currently translated at 100.0% (107 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/da/

* Translated using Weblate (Danish)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/da/

* Added translation using Weblate (Kabyle)

* Added translation using Weblate (Kabyle)

* Translated using Weblate (Kabyle)

Currently translated at 8.8% (59 of 669 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/kab/

---------

Co-authored-by: Daniel Nylander <po@danielnylander.se>
Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Co-authored-by: Nathan <nathan95@live.it>
Co-authored-by: Priit Jõerüüt <jrtkbfdr@users.noreply.translate.fedoraproject.org>
Co-authored-by: Arif Budiman <arifpedia@gmail.com>
Co-authored-by: Jim Spentzos <jimspentzos2000@gmail.com>
Co-authored-by: Mario Blättermann <mario.blaettermann@gmail.com>
Co-authored-by: Juan Jose Pablos <juanjo@apertus.es>
Co-authored-by: Andika Triwidada <andika@gmail.com>
Co-authored-by: joe dalton <joedalton2@yahoo.dk>
Co-authored-by: ButterflyOfFire <butterflyoffire@users.noreply.translate.fedoraproject.org>
2026-02-11 17:16:04 -05:00
Jaye Evins e6673a0a24 Add generic templates (#307)
- Add generic full-page templates.  (This feature from 3.4 was missing)
- Also add generic half-page, quarter-page, and envelope templates.
- Add several more common envelope sizes to page-sizes.xml
- Qt print backend does not need pwg_size.
    - Replace with pwg_class, to distinguish between ISO and NA sizes
2026-02-11 11:27:41 -05:00
Jaye Evins 993e1e460d Tweaks to glabels-3 text object compatability. (#306)
This commit partially addresses issues in #296.  Due to the fact that glabels-3
and glabels-4 use different underlying technologies for rendering text, a
pixel-perfect import can probably never be fully achieved.

This commit focuses on small adjustments to imported text objects to approximate
the visual appearance of these objects.

- glabels-3 rendered text at 75% of stated font size, compensate by adjusting
  font size of imported object.
- Text boxes behave differently in glabels-4 than in glabels-3.  In glabels-4,
  text boxes must be of a fixed size, so compensate when a variable sized
  box (when w=0 and/or h=0) is detected and fix the size to the natural text
  size.
- In glabels-3, the fixed margin size (3pt) was not used in the text baseline
  calculations.  Compensate by adjusting vertical position of imported text
  object.
2026-02-05 18:45:18 -05:00
Mario Blättermann 73d90c28f8 Add hint to README.md about unofficial Fedora package (#302) 2026-02-02 00:27:14 -05:00
Mario Blättermann 6018daf56e Update TRANSLATIONS.md (#297) 2026-01-28 17:49:27 -05:00
Mario Blättermann d51091e089 Update README.md regarding the Archlinux package (#295)
I'm no longer maintaining the Archlinux package. Changed to the name and Github page of the new maintainer.
2026-01-26 01:15:36 -05:00
Jaye Evins 78448a44c9 Replace TRANSLATION_FILES.txt cmake include file with LINGUAS file (#287)
Generate lists of translation (.ts) files by reading LINGUAS in CMake.
2026-01-16 14:17:36 -05:00
Weblate (bot) 0f758456b4 Translations update from Fedora Weblate (#288)
* Translated using Weblate (Ukrainian)

Currently translated at 99.8% (666 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/uk/

* Translated using Weblate (Italian)

Currently translated at 91.9% (613 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/it/

* Translated using Weblate (Polish)

Currently translated at 73.3% (489 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pl/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 90.2% (602 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pt_BR/

* Translated using Weblate (French)

Currently translated at 99.2% (662 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/fr/

* Translated using Weblate (Spanish)

Currently translated at 64.7% (432 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/es/

* Translated using Weblate (French)

Currently translated at 100.0% (107 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/fr/

* Translated using Weblate (German)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/de/

* Translated using Weblate (German)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/de/

* Translated using Weblate (French)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/fr/

* Added translation using Weblate (Estonian)

* Added translation using Weblate (Estonian)

---------

Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Co-authored-by: meteos meteos <meteos@free.fr>
Co-authored-by: Mario Blättermann <mario.blaettermann@gmail.com>
Co-authored-by: Priit Jõerüüt <jrtkbfdr@users.noreply.translate.fedoraproject.org>
Co-authored-by: Jaye Evins <evins@snaught.com>
2026-01-16 14:00:56 -05:00
Weblate (bot) 9341a3b6a2 Translations update from Fedora Weblate (#285)
* Translated using Weblate (Ukrainian)

Currently translated at 99.8% (666 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/uk/

* Translated using Weblate (Italian)

Currently translated at 91.9% (613 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/it/

* Translated using Weblate (Polish)

Currently translated at 73.3% (489 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pl/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 90.2% (602 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/pt_BR/

* Translated using Weblate (French)

Currently translated at 99.2% (662 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/fr/

* Translated using Weblate (Spanish)

Currently translated at 64.7% (432 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/es/

* Translated using Weblate (French)

Currently translated at 100.0% (107 of 107 strings)

Translation: glabels-qt/templates
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/templates/fr/

* Translated using Weblate (German)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/de/

* Translated using Weblate (German)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/de/

* Translated using Weblate (French)

Currently translated at 100.0% (667 of 667 strings)

Translation: glabels-qt/glabels
Translate-URL: https://translate.fedoraproject.org/projects/glabels-qt/glabels/fr/

---------

Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Co-authored-by: meteos meteos <meteos@free.fr>
Co-authored-by: Mario Blättermann <mario.blaettermann@gmail.com>
2026-01-15 17:32:29 -05:00
Rafael Fontenelle 56713aa86f Delete translations/templates_en.ts (#284) 2026-01-14 15:51:51 -05:00
Rafael Fontenelle 1b8b6e55dc Remove redundant pl_PL locale (#283) 2026-01-14 13:57:53 -05:00
Jaye Evins 4b16b0900b Update copyright notices for 2026. (#280) 2026-01-13 19:19:42 -05:00
Jaye Evins 7cadf5308d Implement sizeHint in TemplatePicker's HTML item delegate. (#279)
Height is not always dominated by icon size on all platforms, potentially
cutting off text.
2026-01-13 00:59:47 -05:00
425 changed files with 30377 additions and 23984 deletions
@@ -0,0 +1,184 @@
# Handoff: Packaging design spec approved — implementation plan pending
## Session Metadata
- Created: 2026-04-29 09:55:34 UTC
- Project: /home/claude/bin/sethLabels
- Branch: main
- Session duration: ~1 hour
- Live URL: https://git.sethpc.xyz/Seth/sethLabels
### Recent Commits (for context)
- d3e14c6 docs: refresh CLAUDE.md + IDEA.md for design-approved phase
- 8e272c0 docs: add packaging design spec + decision log
- 9dc6776 chore: add sethLabels deployment-fork scaffold
- d1ee78e Fix incorrect font sizes (#321) ← upstream HEAD
- 06675f8 Create template style guide and minor updates… ← upstream
The first three commits are sethLabels'; everything from `d1ee78e` back is upstream's history (preserved untouched per strict-zero policy — see Important Context below).
## Handoff Chain
- **Continues from**: [2026-04-29-125823-scaffold-only.md](./2026-04-29-125823-scaffold-only.md)
- Previous title: sethLabels scaffolded — no code yet
- **Supersedes**: None. The scaffold-only handoff documented an empty-dir state; this one documents the post-design-approval state.
> Review the previous handoff for full context before filling this one. The "scaffold-only" predecessor's "Suggested Next Steps" #1 (decide upstream-tracking strategy) and #5 (initialize git + push to Gitea) are now complete; #2 (verify upstream alive) and #3 (confirm Qt version) are also resolved during this session.
## Current State Summary
This session moved sethLabels from "scaffold-only, no upstream pulled" to "design-approved, ready for implementation plan." Three things happened in order: (1) upstream `j-evins/glabels-qt` was cloned in-place and pushed to Gitea as `main`, with all 24 upstream contributors' commit authorship preserved end-to-end; (2) the brainstorming skill ran a 6-question multiple-choice round to lock all packaging-strategy decisions; (3) the resulting design was written into a 398-line spec at `sethlabels-docs/specs/2026-04-29-packaging-design.md` and committed. No `scripts/` or `packaging/` code was written — that's the next session's job. The spec is the load-bearing artifact; everything else (CLAUDE.md, IDEA.md, DECISIONS.md) was updated to point at it.
The user explicitly chose option **(3) pause here** at session close, declining to invoke writing-plans this session. The spec is sufficient to resume cleanly; there are no in-progress edits or half-implemented states.
## Architecture Overview
**sethLabels is a deployment fork, not a real fork.** The discipline (locked as Invariant I1 in the spec) is **strict zero source patches** — no upstream-tracked file is ever edited. The only exception is `.gitignore` (allowlisted as a one-time scaffold-time touch). Every sethLabels addition lives in NEW files in NEW top-level directories:
- Already created: `CLAUDE.md`, `IDEA.md`, `DECISIONS.md`, `GITEA_API.md` (gitignored symlink), `.claude/handoffs/`, `sethlabels-docs/specs/`
- Planned per spec: `scripts/` (build-deb, build-appimages, compute-version, check-no-upstream-edits, lib/), `packaging/` (deb-metadata.env, appimage-recipe.env, changelog.md), `README.sethlabels.md`
The "fork" is therefore best thought of as a **packaging repo with upstream's history embedded** — anyone can audit it instantly and confirm we changed nothing in the application itself.
**Upstream details discovered during the session:**
- Qt version: **Qt6 6.2** (find_package at `CMakeLists.txt:119`)
- CPack metadata: pre-wired at `CMakeLists.txt:84-104`; generators NOT pinned → `cpack -G DEB` and `cpack -G DragNDrop` selectable at command line with zero source change
- Install rules: clean and FHS-compliant across all subdirs (`bin`, `share/icons/hicolor`, `share/applications`, `share/mime`, `share/metainfo`, `share/man/man1`, `share/glabels-qt/{templates,translations}`)
- Desktop integration: `.desktop` file, AppStream metainfo, MIME XML, hicolor icon set already provided by upstream
- Two binaries shipped: `glabels-qt` (GUI) + `glabels-batch-qt` (CLI for scripted/mail-merge use)
- CI matrix exists for ubuntu-latest, ubuntu-22.04, windows-latest, macos-latest — but upstream doesn't publish binary releases ("Currently there are no self-hosted binary snapshot releases available" — upstream README). sethLabels exists to fill this gap.
## Critical Files
| File | Purpose | Relevance |
|------|---------|-----------|
| `sethlabels-docs/specs/2026-04-29-packaging-design.md` | THE design spec — 13 sections covering invariants, decisions, repo layout, build pipeline, release flow, brew tap, failure modes, smoke tests, glossary | **Must read before any implementation.** All design questions are answered here; do not re-derive. |
| `DECISIONS.md` | Short-form decision log (6 settled choices + 13 rejected/deferred items) | Quick scan to check what's already been decided/rejected |
| `CLAUDE.md` | Durable project instructions (refreshed this session) | Loaded on every session start; points at this handoff + the spec |
| `IDEA.md` | Plain-language project brief (refreshed this session) | Read if scope feels unclear |
| `CMakeLists.txt` (upstream root) | Defines Qt6 dep, CPack metadata, install rules | Read-only — strict-zero forbids edits. Reference for understanding what `cpack` and `linuxdeploy` will see. |
| `.github/workflows/build-tests.yml` (upstream) | Upstream CI multi-platform build matrix | Reference for valid `apt install` deps + cmake invocation patterns when writing `scripts/lib/deps-debian.sh` |
| `docs/BUILD-INSTRUCTIONS-LINUX.md` (upstream) | Upstream's manual build instructions | Reference for the `apt install` list + cmake flags; our `scripts/build-deb.sh` automates this |
## Key Patterns Discovered
- **Authorship preservation:** the gitea repo holds all 24 upstream contributors' commit authorship intact; the only Seth-authored commits are the sethLabels-specific additions (scaffold + spec + context-refresh). Verifiable via `git log --format='%an' origin/main | sort -u | wc -l` → 25 (24 upstream + Seth).
- **Convention from sibling Seth projects** (`blind_chess`, `sethmux`, `kitty-web`, `mcp-gemma4`, `seth-orchestrator`): `GITEA_API.md` is gitignored (it's a local symlink to `~/bin/GITEA_API.md`); `.backup/` is gitignored; project-tracked files are `CLAUDE.md`, `IDEA.md`, `DECISIONS.md`, `.claude/handoffs/*.md`. sethLabels follows this convention but adds the strict-zero-policy gitignore section.
- **Versioning convention:** `<upstream-tag>-seth<N>` (e.g., `3.99-master618-seth1`). Tag is `git describe --tags --abbrev=0 upstream/master`; `<N>` increments on re-package of the same upstream commit. See spec §D4 + §5.4.
## Tasks Finished
- [x] Cloned upstream `j-evins/glabels-qt` in-place; preserved all upstream commit authorship
- [x] Created Gitea repo `git.sethpc.xyz/Seth/sethLabels` (default branch: `main`); pushed full history + scaffold commit
- [x] Configured `upstream` remote → `github.com/j-evins/glabels-qt` for periodic rebases
- [x] Added scaffold commit (`9dc6776`) with author `Seth Freiberg <seth@sethfreiberg.com>` containing CLAUDE.md, IDEA.md, DECISIONS.md, .claude/handoffs/, .gitignore additions
- [x] Brainstormed all 6 packaging-strategy decisions: Linux format, macOS format, build infra, versioning, upstream-touch policy, package name
- [x] Wrote design spec at `sethlabels-docs/specs/2026-04-29-packaging-design.md` (398 lines, 13 sections); self-reviewed and fixed 5 inline issues (FF/rebase wording, --peek removal, tag-fetch caller responsibility, T3 brittleness, working-tree drift in check-no-upstream-edits)
- [x] Updated `DECISIONS.md` with 6 settled + 13 rejected/deferred decisions (all dated 2026-04-29)
- [x] Refreshed `CLAUDE.md` "Current State" + "Conventions" sections; refreshed `IDEA.md` "Constraints / preferences"
- [x] All 3 sethLabels commits pushed to Gitea immediately per the gitea-workflow convention
## Files Modified
| File | Changes | Rationale |
|------|---------|-----------|
| `.gitignore` | Appended sethLabels section (`.backup/`, `GITEA_API.md`, `.env*`, `.claude/handoffs/*.draft.md`) | Allowlisted exception to strict-zero (one-time scaffold touch) |
| `CLAUDE.md` | NEW — project instructions | Created at scaffold time; refreshed this session for design-approved phase |
| `IDEA.md` | NEW — project brief | Created at scaffold time; refreshed this session |
| `DECISIONS.md` | NEW — populated with 6 settled + 13 rejected/deferred decisions | Tracks what was decided vs. explicitly rejected (per Seth's global persistence convention) |
| `sethlabels-docs/specs/2026-04-29-packaging-design.md` | NEW — design spec | The design artifact this session produced |
| `.claude/handoffs/2026-04-29-095534-spec-approved-pre-implementation.md` | NEW — this handoff | Session close artifact |
No upstream files were modified (verified by `git diff --name-only upstream/master..HEAD` — only allowlist entries appear).
## Decisions Made
| Decision | Options Considered | Rationale |
|----------|-------------------|-----------|
| Linux: `.deb` + AppImage | AppImage-only, .deb-only, both, Flatpak | `.deb` for Debian-family install ergonomics + AppImage for any-Linux portability. Flatpak too heavyweight for use case. See spec §D1. |
| macOS: Homebrew tap, build-from-source | Unsigned .dmg, signed+notarized .dmg ($99/yr), brew tap, brew tap with cask | Brew tap eliminates macOS CI/signing/Apple Dev ID entirely. User's Mac builds from source on `brew install`. See spec §D2. |
| Build infrastructure: manual local builds | Manual, Gitea Actions runner, GitHub Actions public, GitHub Actions private | Local feedback loop beats CI loop during iteration. Scripts in `scripts/` are canonical recipe; CI YAML at the public-flip will call them unmodified. See spec §D3. |
| Versioning: `<upstream-tag>-seth<N>` | This vs. plain upstream tag, independent semver, date-based | Lineage-preserving + rebuild counter survives packaging-only fixes + sorts correctly under `dpkg --compare-versions`. See spec §D4. |
| Upstream-touch policy: strict zero | Strict zero, permissive small patches, strict-zero-with-CMakeLists-carveout | CPack `-D` flags cover all needed metadata at build time → no edit required to package. See spec §D5. |
| Package name: `glabels-qt` | This vs. `sethlabels` | Strict-zero forbids renaming the binary, so package name should match command name. sethLabels identity lives in repo name + version-string `-seth<N>` marker. See spec §D6. |
| Spec/docs location: `sethlabels-docs/` (top-level new dir) | This vs. `docs/superpowers/specs/` (inside upstream's docs/) | Strict-zero spirit forbids polluting upstream namespaces, even with new files. Top-level new dir = cleanest fork boundary. |
## Immediate Next Steps
1. **Invoke `writing-plans` skill** with the spec at `sethlabels-docs/specs/2026-04-29-packaging-design.md` as input. The plan should produce an ordered, dependency-aware implementation sequence — likely something like: (a) scripts/lib/deps-debian.sh, (b) scripts/check-no-upstream-edits.sh, (c) scripts/compute-version.sh, (d) scripts/build-deb.sh + smoke test on a clean Debian 13 box, (e) scripts/build-appimages.sh + smoke tests, (f) packaging/ env files, (g) README.sethlabels.md, (h) homebrew tap repo + initial formula, (i) first end-to-end release dry run.
2. **Address the 4 user-flagged review items** before or during plan execution:
- §5.1 build dependency list — Seth may know Debian 13 quirks (e.g., `qt6-tools-dev-tools` vs `qt6-tools-dev` package naming)
- §5.5 allowlist pattern — anything Seth wants to add that doesn't fit `scripts/`/`packaging/`/`sethlabels-docs/`?
- §7.2 brew formula `:recommended` deps — `qrencode` and `zint` as recommended (default-on) vs required vs optional
- §10 smoke test T5 — gate every release on a fresh-Debian-13-VM install test, or only on upstream-tag bumps?
3. **Consider whether to spike Path A (Qt for WebAssembly)** later — Seth raised this as a hypothetical and we concluded it's "possible but not easy" because Qt's `QPrintSupport` doesn't work in WASM (would need to render-to-PDF and let user download). Not blocking, just flagged for future.
## Blockers / Open Questions
- None blocking. The 4 review items in step 2 above are open but optional — they can be addressed during plan execution as small fixups, not gating questions.
## Deferred Items
- **Windows packaging** — deferred per project brief. Upstream's NSIS support is intact and works for anyone who wants to build their own.
- **Custom default templates baked into the package** — strict-zero forbids; user-specific templates can live in `~/.config/glabels-qt/templates/` or a future separate repo.
- **Branding, icon, splash, or string changes** — strict-zero forbids. sethLabels is a packaging fork, not a rebrand.
- **CI infrastructure (Gitea Actions / GitHub Actions runner)** — battle-test phase is manual local builds; CI is added at the eventual public-flip on GitHub.
- **Distribution to Debian backports / PPA / Ubuntu universe** — requires Debian Developer mentorship + ongoing policy compliance work; not justified for current scope.
- **Headless print-server CT** — mentioned in `IDEA.md` as "optional/later"; not in current spec scope.
## Important Context
**The strict-zero source-patch policy is not a guideline, it is the project's defining discipline.** Violating it means the project drifts from "deployment fork" toward "real fork," which breaks the trivial-rebase property that makes the whole approach work. The spec's Invariant I1 is enforced by `scripts/check-no-upstream-edits.sh` (to be implemented per spec §5.5). Any temptation to "just edit one upstream file to fix a packaging issue" should be resisted — the right move is either (a) pass via `cpack -D` flags or `linuxdeploy` config, or (b) upstream the fix as a PR to glabels-qt.
**The eventually-public-on-GitHub framing matters for build-host neutrality.** During battle-test, builds happen on steel141 (Seth's primary dev machine, Debian 13). At public-flip, builds move to GitHub Actions ubuntu-latest runners. The build scripts MUST work on a clean Debian 13 / Ubuntu LTS VM with nothing pre-installed beyond what `scripts/lib/deps-debian.sh` declares. Any steel141-specific path or tool dependency is a bug.
**Steel141 is a build host, NOT an install target.** Earlier session draft framed it as the deploy target — that was wrong, corrected during Q1. The artifacts ship to anyone running Debian-family Linux or macOS-with-brew.
**Authorship in git history is load-bearing.** All 24 upstream contributors' commits appear in `git log` with their original author/committer fields intact. Only sethLabels-specific commits (currently 3) carry Seth's authorship. This makes the fork's relationship to upstream provable end-to-end and is critical for the eventual public-fork narrative.
**The "scaffold commit" is the only sethLabels commit on top of upstream/master.** Currently `9dc6776 chore: add sethLabels deployment-fork scaffold`. Two more commits exist (`8e272c0` spec + `d3e14c6` CLAUDE.md/IDEA.md refresh) but they only touch sethLabels-namespaced files. The number of commits on top of upstream will grow; what matters is that all of them honor strict-zero.
## Assumptions Made
- **The user picked `glabels-qt` as the package name** (Q6 → α) intending the binary, brew formula, and `.deb` package to all share the name. If a future Debian official `glabels-qt` package emerges, the version-string `-seth<N>` marker will dominate the sort, but a name conflict could be revisited.
- **The user has Homebrew on the macOS machines they intend to install on.** The brew-tap approach assumes a technical user; if a non-technical macOS user enters scope, signed-DMG would have to be reconsidered.
- **The user's scaffold commit (Author: Seth Freiberg <seth@sethfreiberg.com>) was set explicitly via `git config user.email seth@sethfreiberg.com` for this repo only.** The global git identity on steel141 is `Mortdecai` (a bot identity). Future commits in this repo from Claude Code should use the same Seth identity to maintain authorship consistency. The per-repo `.git/config` is already set; new agents inherit it automatically.
## Potential Gotchas
- **Don't run a non-rebase pull from upstream.** `git pull upstream master` (without `--rebase`) would create a merge commit, breaking linear history and complicating future strict-zero enforcement. The release flow's step 2 (spec §6) says `git rebase upstream/master`, which is correct.
- **`compute-version.sh` reads local tag database.** If invoked outside the release flow without a fresh `git fetch --all --tags`, it can produce a stale `<N>` value. Spec §5.4 calls this out, but it's easy to miss when running scripts manually during development.
- **AppImage builds need `linuxdeploy` and `linuxdeploy-plugin-qt` from GitHub releases — neither is apt-installable.** `scripts/lib/linuxdeploy.sh` (to be written) handles bootstrap to a script-local cache. The cache directory must be added to `.gitignore`.
- **`dpkg-shlibdeps` (CPack's `SHLIBDEPS=ON`) sometimes mis-detects runtime deps** — particularly with optional Qt6 plugins. Mitigation in spec §F8: smoke-test install on a clean Debian 13 VM (T5).
- **`brew tap` from non-GitHub URLs requires the explicit URL form.** Initial install is `brew tap seth/tap https://git.sethpc.xyz/Seth/homebrew-tap.git`, not `brew tap seth/tap`. This is documented in spec §7.3 but easy to forget when writing the brew tap README.
- **Don't add `superpowers/` paths under `docs/`.** The brainstorming skill's default spec location is `docs/superpowers/specs/`, but `docs/` is an upstream directory, so we use `sethlabels-docs/specs/` instead. This was caught and corrected mid-session.
## Environment State
### Tools/Services Used
- **gitea CLI** (`~/bin/gitea`) — used for `gitea create sethLabels`, `gitea remote sethLabels`. Token loaded from `~/.config/gitea/token`. Documented in `~/bin/GITEA_API.md` (symlinked into project but gitignored).
- **git** — local tooling for clone, fetch, commit, push, tag. Per-repo identity set to `Seth Freiberg <seth@sethfreiberg.com>` to override the global `Mortdecai` bot identity.
- **curl + python3** — used for Gitea API calls to verify `default_branch=main` post-push.
### Active Processes
- None. No background services were started or left running. No long-running shells.
### Environment Variables
- `HOMELAB_PASSWORD` — referenced by `~/bin/CLAUDE.md` for SSH access, NOT used in this session.
- No other env vars set or required for the current state.
## Related Resources
- **Gitea repo:** https://git.sethpc.xyz/Seth/sethLabels (default branch `main`)
- **Spec:** [`sethlabels-docs/specs/2026-04-29-packaging-design.md`](../../sethlabels-docs/specs/2026-04-29-packaging-design.md) — read this before any implementation
- **Decision log:** [`DECISIONS.md`](../../DECISIONS.md) — short-form
- **Predecessor handoff:** [`2026-04-29-125823-scaffold-only.md`](./2026-04-29-125823-scaffold-only.md) — the empty-scaffold state we resumed from
- **Upstream:** https://github.com/j-evins/glabels-qt (j-evins is Jaye Evins of glabels.org)
- **Upstream README packaging gap:** the line we're filling — *"Currently there are no self-hosted binary snapshot releases available… I encourage you to try building the code yourself."*
- **Sibling Seth projects with similar conventions:** `~/bin/blind_chess/` (handoff structure reference), `~/bin/sethmux/` (gitignore convention)
---
**Security Reminder**: Validated via `validate_handoff.py` post-write. No secrets present.
@@ -0,0 +1,167 @@
# Handoff: macOS Launchpad/Spotlight integration via stub .app wrapper added to brew tap
## Session Metadata
- Created: 2026-04-29 12:15:29 UTC
- Project: /home/claude/bin/sethLabels
- Branch: main
- Session duration: continuation of the same session that produced the first-release handoff (2026-04-29-155439); this addition is ~1 hour of follow-up work
### Recent Commits (for context)
- f6c30f2 test: move bats scratch dirs to repo-local .test-scratch/ (per global no-/tmp/ rule)
- 76a3cb7 docs: README.sethlabels.md — include upstream remote setup in build-from-source
- 891cc7c docs: add session handoff (first-release)
- 2d04943 docs: refresh CLAUDE.md to post-first-release phase
- 2108e2c docs: changelog for 3.99-master618-seth1
Plus pending uncommitted edits this session (will be committed by the wrap-up step):
- CLAUDE.md (Conventions section: removed stale "to be implemented" wording for check-no-upstream-edits.sh; added tests-impl/ to dirs list)
- DECISIONS.md (appended .app launcher decision)
Brew tap repo (`git.sethpc.xyz/Seth/homebrew-tap`) has TWO new commits this session:
- ef4d6c7 feat: generate stub .app bundle for Launchpad/Spotlight integration on macOS
- 3542762 fix: use upstream SVG (not nonexistent PNG) for .app icon conversion
## Handoff Chain
- **Continues from**: [2026-04-29-155439-first-release.md](./2026-04-29-155439-first-release.md)
- Previous title: sethLabels packaging pipeline live — first release published
- **Supersedes**: None.
> The predecessor captures the 12-task implementation + first-release publication. This handoff extends that work with a single follow-up feature: macOS Launchpad/Spotlight integration. No regressions in the predecessor's deliverables; everything from the first release is unchanged and still live.
## Current State Summary
This session continued from "first release published" state. Seth asked whether the brew install would put a glabels-qt launcher icon in the Mac menu/Launchpad. Answer: no, because upstream's `glabels/CMakeLists.txt:125` declares `add_executable(glabels-qt WIN32 ...)` with no `MACOSX_BUNDLE` keyword, producing a CLI-only Mach-O on macOS. Strict-zero (I1) forbids patching upstream to fix this. Seth picked option 1 (stub `.app` wrapper synthesized in the brew formula) over option 2 (upstream a PR) and option 3 (switch to a Cask). Implemented as two commits on the brew tap repo. The sethLabels repo itself was NOT modified — the entire feature lives in the tap's `def install` block.
The `.app` launcher works by: (1) cmake installs binaries to `bin/` per upstream rules, (2) brew formula's `def install` then synthesizes `<prefix>/glabels-qt.app/Contents/{Info.plist, MacOS/glabels-qt, Resources/glabels-qt.icns}` where the launcher script is a 2-line shell that `exec`s the real CLI binary, (3) the icon is converted from upstream's installed SVG via macOS-built-in `sips`, (4) the formula's `caveats` block tells the user to run `cp -R "$(brew --prefix glabels-qt)/glabels-qt.app" /Applications/` once.
NOT YET VALIDATED: needs first install on a real Mac. Two unknowns: whether macOS 13+ `sips` actually accepts SVG input (begin/rescue catches the failure with an `opoo` if not — falls back to generic icon), and whether Gatekeeper requires a right-click→Open on first launch (likely yes since the .app isn't signed, but acceptable for the project's audience).
## Codebase Understanding
### Architecture Overview
The brew tap pattern: a Homebrew formula's `def install` runs on the user's Mac during `brew install`. It can do anything the user's shell can do, including writing files outside the source tree (within the Cellar prefix). This is the legitimate sethLabels-side hook for filling gaps that strict-zero forbids fixing in upstream code. The .app wrapper is one such gap; others (e.g., a future macOS-specific `Info.plist` content type registration for `.glabels` files) could plug in here too.
The launcher script approach (`exec "#{bin}/glabels-qt" "$@"`) is a thin wrapper, not a copy. It avoids:
- Having to `MACOSX_BUNDLE` the cmake target (needs upstream patch — strict-zero forbids)
- Running `macdeployqt` on the binary (needs Mac to build — defeats decision D2's no-Mac-CI goal)
- Maintaining a separate Cask with a pre-built artifact (same problem)
The wrapper has one downside: launching from Launchpad doesn't inherit a shell PATH, so the wrapper's `exec` path is hardcoded at install time using brew's `#{bin}` interpolation. That `#{bin}` resolves to `/opt/homebrew/Cellar/glabels-qt/<version>/bin/` on Apple Silicon, which has rpath set up correctly for Qt6 lookup. Should "just work" without `DYLD_LIBRARY_PATH` or `QT_PLUGIN_PATH` exports.
### Critical Files
| File | Purpose | Relevance |
|------|---------|-----------|
| `~/bin/homebrew-tap/Formula/glabels-qt.rb` | The brew formula. Contains `def install` (cmake build + .app synthesis), `def caveats` (user-facing post-install message), and `test do` (assert `--version` works). | This is the ONLY file the user changes per release — bump `tag:` and `revision:` (and the SHA needs `# pragma: allowlist secret` to bypass the tap repo's detect-secrets pre-commit hook). |
| `~/bin/homebrew-tap/README.md` | Tap install instructions. | Has a "Launchpad / Spotlight integration (macOS)" section documenting the one-time `cp -R` step. |
| `glabels/CMakeLists.txt` (upstream — DO NOT EDIT) | Lines 125 (`add_executable(glabels-qt WIN32 ...)` — no MACOSX_BUNDLE) and 152-156 (icon install rules) explain why we need the wrapper and where the SVG icon comes from. | Read-only — strict-zero forbids edits. The reason we need the .app wrapper. |
| `~/bin/sethLabels/sethlabels-docs/specs/2026-04-29-packaging-design.md` | Design spec. §D2 covers the brew tap decision; the .app wrapper is a sub-decision under it. | Reference for why brew tap was chosen over .dmg/Cask. |
| `~/bin/sethLabels/DECISIONS.md` | Project decision log. Has a new entry for the .app launcher choice. | Quick scan to see what was already decided/rejected. |
### Key Patterns Discovered
- **`on_macos do ... end`** — Homebrew DSL block for macOS-only formula logic. Wraps both the .app generation (in `def install`) and the user message (in `def caveats`). On Linux brew (rare for this formula), the .app code is skipped entirely.
- **Path interpolation in heredocs** — the launcher script uses `#{bin}/glabels-qt` interpolation. At formula evaluation time `#{bin}` becomes the absolute Cellar path. So the launcher script written to disk has a hardcoded full path, not an env-dependent reference.
- **`sips` for SVG → icns** — macOS-built-in tool. Wrapped in `begin/rescue` so a sips failure on older macOS (which can't read SVG) just `opoo`s and the .app gets a generic icon — no error path.
- **detect-secrets in tap repo** — the tap has a detect-secrets pre-commit hook that flags 40-char hex strings as secrets. The `revision:` field (a git SHA) gets a `# pragma: allowlist secret` inline comment. Every future tap bump must preserve that pragma. Future improvement: add the SHA pattern to `.secrets.baseline` so the pragma isn't needed.
## Work Completed
### Tasks Finished
- [x] Diagnosed the menu-launcher question by reading upstream `glabels/CMakeLists.txt:125,150` (no `MACOSX_BUNDLE`) and `docs/BUILD-INSTRUCTIONS-MACOS.md` (CLI-only `make install`)
- [x] Presented three implementation options to Seth; he picked option 1 (stub .app via brew formula)
- [x] Implementer subagent generated the .app wrapper block in `def install` + `caveats` method + README.md "Launchpad / Spotlight" section. Committed as `ef4d6c7` on the tap.
- [x] Caught a bug via context check: the initial implementation globbed for `glabels.png` but upstream installs only SVGs (`glabels/CMakeLists.txt:152-156`). The `opoo` fallback would have fired on every install, leaving every .app with a generic icon.
- [x] Fix subagent updated the glob to `glabels.svg`, prefer the scalable variant, fall back to sized variants, wrap `sips` in `begin/rescue`. Committed as `3542762` on the tap.
- [x] CLAUDE.md fixed: removed stale "(to be implemented per spec §5.5)" wording for the guardrail; added `tests-impl/` to the dirs-list (uncommitted at handoff time).
- [x] DECISIONS.md appended: macOS Launchpad/Spotlight integration via stub .app wrapper, with rationale (uncommitted at handoff time).
### Files Modified
| File | Changes | Rationale |
|------|---------|-----------|
| `CLAUDE.md` (sethLabels) | Removed stale "(to be implemented per spec §5.5)" parenthetical; expanded the "Enforced by..." line to mention working-tree drift + ref-existence check; added `tests-impl/` to dirs list. | Stale wording flagged by cumulative review last session; tests-impl/ omission was a small accuracy gap. |
| `DECISIONS.md` (sethLabels) | Appended decision entry for the .app launcher approach. | Project's Decision-Log convention: every non-obvious settled choice gets logged. |
| `~/bin/homebrew-tap/Formula/glabels-qt.rb` | Added `on_macos do` block in `def install` to synthesize the .app; added `def caveats`; later fixed the icon glob from PNG to SVG. | Two commits — ef4d6c7 (initial) + 3542762 (icon fix). |
| `~/bin/homebrew-tap/README.md` | New "Launchpad / Spotlight integration (macOS)" subsection under `## Install`. | User-facing docs for the one-time `cp -R` step. |
### Decisions Made
| Decision | Options Considered | Rationale |
|----------|-------------------|-----------|
| .app launcher via brew formula `def install` synthesis | (1) Brew formula synthesis, (2) Upstream PR adding MACOSX_BUNDLE, (3) Switch from Formula to Cask with pre-built .app | Option 1 lives entirely sethLabels-side, no upstream dep, no Mac CI required. Option 2 indefinite timeline (upstream review). Option 3 needs a Mac to build the .app (defeats D2's no-macOS-CI simplification). |
| Icon source = upstream SVG, converted to icns via `sips` | (a) Skip icon (generic), (b) Convert SVG via sips, (c) Convert PNG via sips, (d) Ship pre-built .icns in tap repo, (e) Fetch .icns as a brew resource | (b) chosen. Upstream installs only SVGs — verified at `glabels/CMakeLists.txt:152-156`. (c) was the initial implementation's bug. (a) is the rescue-block fallback. (d)/(e) add tap-repo maintenance. |
| Don't auto-link .app to /Applications/ | (i) Manual `cp -R` (user runs once), (ii) Symlink during install, (iii) Use `brew linkapps` | (i) chosen. (ii) requires writing to `/Applications/` which brew formulas can't do without sudo. (iii) is deprecated. The caveats block reminds the user. |
## Immediate Next Steps
1. **First Mac install validation.** When you (or Seth) get to a Mac with brew, run `brew tap seth/tap https://git.sethpc.xyz/Seth/homebrew-tap.git && brew install seth/tap/glabels-qt`. Expected: build succeeds (~5-10 min first time), `which glabels-qt` finds the binary, `cp -R "$(brew --prefix glabels-qt)/glabels-qt.app" /Applications/` succeeds, the app appears in Launchpad and is searchable in Spotlight. If `sips` failed silently (older macOS), the icon will be generic — check Launchpad first.
2. **First-launch Gatekeeper handling.** macOS will likely block first launch with "cannot be opened because it is from an unidentified developer." Right-click → Open is the standard bypass. Document this in the tap README if it turns out to be a notable friction point.
3. **T5 fresh-Debian-13-VM smoke test for the .deb** (still deferred from the first-release handoff — also not yet done). Spin up a clean Debian 13 VM, download the .deb from the release page, install with `apt install ./...`, run `glabels-qt --version`. If unmet deps surface, override via `CPACK_DEBIAN_PACKAGE_DEPENDS` in `scripts/build-deb.sh` and re-tag as -seth2.
## Blockers / Open Questions
- **Does `sips` on the user's macOS version handle SVG input?** macOS 13+ should; older versions may fail. The `rescue` block falls back gracefully — the only signal will be a generic Mac icon in Launchpad.
- **Will Gatekeeper friction be acceptable to Seth's eventual users?** First-launch right-click→Open is standard for unsigned apps. If it becomes a nuisance, options are: (a) self-sign with a free Apple ID (no notarization, only works for personal use), (b) properly sign + notarize ($99/year — explicitly rejected in §D2), (c) document the right-click→Open step prominently.
## Deferred Items
- **Adding the SHA pattern to `.secrets.baseline`** in the tap repo — would eliminate the need for `# pragma: allowlist secret` on every future tap bump. Trivial change but I left it for a future session since it's not blocking.
- **Verifying the `.app` actually contains all needed Qt6 plugins on user-side** — brew's Qt6 ships with cocoa platform plugin, image format plugins, and SVG support. The wrapper's `exec` of the real binary picks them up via the binary's rpath. Should "just work" but unconfirmed without a Mac test.
- **Cumulative-review minor follow-ups** still deferred from previous handoff: build-appimages.sh step counter `[1/6]` reused 3x, `packaging/appimage-recipe.env` is currently unwired, `compute-version.sh` opaque error if upstream has no annotated tags, changelog.md not discoverable from README.
## Important Context
**The .app wrapper is the FIRST piece of sethLabels-side macOS-specific build logic.** Up to this point, sethLabels was fully cross-platform-by-virtue-of-strict-zero — every script was Linux-only because the targets were Linux-only. This session adds the first piece of mac-conditional code, but ONLY on the brew-tap side (the sethLabels repo itself remains Linux-targeted). Future macOS-specific gaps (e.g., `.glabels` UTI registration, dock badge support, etc.) should follow the same pattern: handled in the brew formula's `def install` and `def caveats`, never via patches to upstream code.
**The tap's detect-secrets hook is a known papercut.** Every release-flow run will require manually preserving the `# pragma: allowlist secret` comment on the `revision:` line after `sed`-replacing the SHA. The cleanest fix is to add the SHA pattern to `.secrets.baseline` (a `pre-commit run --all-files` regenerate after a `pre-commit autoupdate`). Until then, the release flow's tap-bump step should warn about this.
**Don't conflate the .app wrapper with a "real" Mac app.** It's a thin shell script in `Contents/MacOS/`. Apps that need to listen for system events, register URL schemes, or claim file types properly need a real bundle with proper Info.plist UTI declarations. The current Info.plist has only the bare-minimum keys for Launchpad/Spotlight; if Seth ever wants drag-a-`.glabels`-onto-the-icon behavior, that's a separate Info.plist change.
## Assumptions Made
- The user has macOS 13+ (so `sips` handles SVG). Older macOS gets the rescue path with a generic icon — works, just ugly. The project audience (technical users with brew) skews to recent macOS, so this is acceptable.
- Brew's installed Qt6 binary correctly resolves Qt plugins via rpath when launched from a non-shell context (Launchpad). Standard for brew-installed Qt apps; unverified here.
- The `/Applications/` copy is not a deal-breaker for the user (vs. an automatic symlink). Users running brew already accept similar manual steps for `brew linkapps`-style integrations.
- Upstream's scalable SVG icon will continue to be installed at the spec'd path on macOS. If upstream restructures the icon install rules, the formula's glob may miss — `opoo` then falls through to generic icon (not a fail-build).
## Potential Gotchas
- **`brew --prefix glabels-qt`** in the caveats text resolves the formula's installed prefix. If the user runs the `cp -R` BEFORE actually installing, it'll error with "no formula found." The caveats text shows this command in the post-install message, which is where it makes sense.
- **Re-running `cp -R` after `brew upgrade`** is required because Launchpad caches the .app. The README documents this. Future improvement could be a small post-install hint via `brew services`-style integration, but that's out of scope.
- **Editing the formula requires care around heredoc delimiters.** The current file has three: `SH` (launcher), `PLIST` (Info.plist), `CAVEATS`. Each must open and close correctly; an unclosed heredoc would silently consume the rest of the file as content. Visual inspection on the live tap confirmed all three are balanced.
- **The .app wrapper's launcher script is shell, not a Mach-O binary.** This may cause Gatekeeper to flag it more aggressively on first launch than a signed Mach-O would. If it becomes a problem, alternatives are: (a) hardlink/symlink the real binary into the launcher path, (b) compile a tiny C program that `exec`s the real binary.
## Environment State
### Tools/Services Used
- **Homebrew tap** at `git.sethpc.xyz/Seth/homebrew-tap` — separate Gitea repo (NOT inside sethLabels). Has its own per-release commit history (one commit per release, bumping `tag:` and `revision:`).
- **gitea CLI** (`~/bin/gitea`) — not directly used this session (the tap was already created in Task 11 of the previous session).
- **detect-secrets** (pre-commit hook on the tap repo) — flagged the revision SHA; resolved with inline pragma comment.
### Active Processes
- None.
### Environment Variables
- `HOMEBREW_PREFIX` — referenced in the formula's `caveats` text, resolves on the user's Mac.
- No new env vars set or required this session.
## Related Resources
- **First-release handoff (predecessor):** [`2026-04-29-155439-first-release.md`](./2026-04-29-155439-first-release.md) — predecessor capturing the 12-task implementation + first published release
- **Spec-approved-pre-implementation handoff (grandfather):** [`2026-04-29-095534-spec-approved-pre-implementation.md`](./2026-04-29-095534-spec-approved-pre-implementation.md) — the design state we resumed from
- **Design spec:** [`../sethlabels-docs/specs/2026-04-29-packaging-design.md`](../../sethlabels-docs/specs/2026-04-29-packaging-design.md) §D2 (brew tap decision)
- **Implementation plan:** [`../sethlabels-docs/plans/2026-04-29-packaging-implementation.md`](../../sethlabels-docs/plans/2026-04-29-packaging-implementation.md) — the 12-task plan that built the pipeline
- **Brew tap (live):** https://git.sethpc.xyz/Seth/homebrew-tap
- **First sethLabels release:** https://git.sethpc.xyz/Seth/sethLabels/releases/tag/3.99-master618-seth1
- **Upstream glabels-qt cmake target (read-only reference):** `glabels/CMakeLists.txt:125` (the `WIN32` keyword without `MACOSX_BUNDLE`) and `glabels/CMakeLists.txt:152-156` (icon install rules)
---
**Security Reminder**: No secrets present. Validated post-write.
@@ -0,0 +1,73 @@
# Handoff: sethLabels scaffolded — no code yet
## Session Metadata
- Created: 2026-04-29 12:58:23 UTC
- Project: /home/claude/bin/sethLabels
- Branch: n/a (no git repo yet)
- Session duration: ~5 min
- Live URL: n/a
## Handoff Chain
- **Continues from:** None — this is the project's first handoff.
- **Supersedes:** None.
## Current State Summary
Project directory scaffolded per `~/bin/CREATE_PROJECT.md` as a deployment fork of upstream [glabels-qt](https://github.com/j-evins/glabels-qt). No code has been pulled, no git repo initialized, no Gitea repo created. Only the `~/bin/`-convention files exist:
```
sethLabels/
├── CLAUDE.md durable project instructions
├── DECISIONS.md empty decision log (template-derived, header set)
├── GITEA_API.md symlink → ~/bin/GITEA_API.md
├── IDEA.md plain-language brief
└── .claude/handoffs/
└── 2026-04-29-125823-scaffold-only.md (this file)
```
Phase: **ideation**. Nothing is running anywhere. No upstream commit pinned. No build attempted.
## Architecture Overview
This is a *deployment fork* — the discipline is to keep the diff against `j-evins/glabels-qt` master surgical so we can rebase periodically without pain. Anything we add should be additive (new files: deploy scripts, packaging recipes, Seth-specific templates) rather than invasive edits to upstream source. If we need to patch upstream code, prefer a thin patch series we can replay.
Stack is Qt + CMake + C++ (GPL-3.0). Target host is **steel141** (Debian 13). A future option is a headless print-server CT, but that's not part of this scaffold's scope.
## Critical Files
| File | Purpose | Relevance |
|------|---------|-----------|
| `~/bin/sethLabels/IDEA.md` | Plain-language brief — why this fork exists | Read first if upstream choice or scope feels unclear |
| `~/bin/sethLabels/CLAUDE.md` | Durable project instructions | Loaded every session |
| `~/bin/sethLabels/DECISIONS.md` | Empty — populate as architectural choices land | Write to when locking in upstream-pin strategy, Qt5-vs-Qt6, etc. |
| `~/bin/CREATE_PROJECT.md` | Recipe used to scaffold this | Reference if future projects need the same shape |
## Suggested Next Steps (ordered)
The user said *just scaffold + handoff* — none of this was attempted. Pick up here next session:
1. **Decide upstream-tracking strategy.** Options:
- (a) Clone `j-evins/glabels-qt` into this dir, push to Gitea as `sethLabels`, add upstream as a remote, merge from `upstream/master` periodically.
- (b) Keep upstream as a git submodule and layer deployment glue around it.
Record the choice in `DECISIONS.md` before pulling code.
2. **Verify upstream is alive.** Check `j-evins/glabels-qt` for last commit date + open issues; this is a fork of mate-desktop's glabels lineage and forks-of-forks have a tendency to bitrot. If `j-evins` is stale, the real upstream might be elsewhere — re-evaluate before forking.
3. **Confirm Qt version.** Upstream's `CMakeLists.txt` will say Qt5 or Qt6. Debian 13 ships both — pick whichever upstream targets.
4. **Build it once on steel141** to establish the known-good build recipe. Capture exact `apt install` deps and CMake invocation in a `BUILD.md` (or in `CLAUDE.md` if short).
5. **Initialize git + push to Gitea.** `gitea create sethLabels``gitea remote sethLabels``gitea push`. Use a descriptive commit message like `init: scaffold + import upstream glabels-qt @ <sha>`.
6. **Only then** start any deployment-specific work (templates, packaging, install scripts).
## Open Questions
- Is `j-evins/glabels-qt` actually the right upstream, or should we be tracking a different fork? (See "verify upstream is alive" above.)
- Does Seth want a `.deb` package, an AppImage, or just a built binary in `/usr/local/bin`?
- Is there a printer model or label-stock library we should pre-load as default templates?
These don't block scaffolding — they block the *first real coding session*. Ask before implementing.
## Risks / Watch-outs
- Upstream is GPL-3.0. Any code we add that links against it must also be GPL-3.0-compatible. Don't accidentally relicense.
- "Deployment fork" failure mode: scope creep into a real fork. If we find ourselves writing >100 lines of upstream-source patches, that's a signal to either upstream the change or rethink whether we actually want a fork.
- glabels-qt is one of those projects with multiple competing forks (j-evins, jimevins-original, mate-desktop's glabels-3, etc.). Pin the upstream we choose explicitly in `DECISIONS.md` so we don't drift.
@@ -0,0 +1,76 @@
# Handoff: sethLabels packaging pipeline live — first release published
## Session Metadata
- Created: 2026-04-29 15:54:39 UTC
- Project: /home/claude/bin/sethLabels
- Branch: main
- Live URL: https://git.sethpc.xyz/Seth/sethLabels
- First release: https://git.sethpc.xyz/Seth/sethLabels/releases/tag/3.99-master618-seth1
### Recent Commits (for context)
```
2d04943 docs: refresh CLAUDE.md to post-first-release phase
2108e2c docs: changelog for 3.99-master618-seth1
8290870 docs: add README.sethlabels.md (fork entry point)
9b97080 docs: add scripts/README.md (operator run guide)
2a789e3 fix: guard batch AppImage icon path with pre-flight check
e619699 chore: add xvfb to deps-debian.sh (required by build-appimages smoke tests)
f7e3565 fix: prune unused binary from each AppDir before linuxdeploy bundling
d5fb872 feat: add build-appimages.sh with inline smoke tests T3, T4
13d4047 fix: guard rm -rf in build-deb.sh against empty BUILD_DIR
4f2de8a feat: add build-deb.sh with inline smoke tests T1, T2
```
## Handoff Chain
- **Continues from**: [2026-04-29-095534-spec-approved-pre-implementation.md](./2026-04-29-095534-spec-approved-pre-implementation.md)
## Current State Summary
The sethLabels packaging pipeline is fully implemented and the first tag (3.99-master618-seth1) is published to Gitea with three artifacts (1 .deb + 2 AppImages). The Homebrew tap at `git.sethpc.xyz/Seth/homebrew-tap` is bumped to point at the new tag. CLAUDE.md is refreshed. Ready for periodic releases via the spec §6 flow.
## Tasks Finished
- [x] All 12 tasks of the implementation plan executed end-to-end
- [x] First .deb built and attached: glabels-qt_3.99-master618-seth1_amd64.deb (42M / 43,640,116 bytes)
- [x] First AppImages built and attached: sethlabels-gui-3.99-master618-seth1-x86_64.AppImage (34M / 34,781,688 bytes) and sethlabels-batch-3.99-master618-seth1-x86_64.AppImage (33M / 34,404,856 bytes)
- [x] Gitea release published at https://git.sethpc.xyz/Seth/sethLabels/releases/tag/3.99-master618-seth1 (release ID 24)
- [x] Homebrew tap bumped to 3.99-master618-seth1 (commit 3f0451c on git.sethpc.xyz/Seth/homebrew-tap)
- [x] CLAUDE.md refreshed for post-first-release phase (commit 2d04943)
- [x] Three smoke tests pass: T1 (.deb info), T2 (.deb contents), T3 (batch --version), T4 (gui --help under Xvfb)
## Deferred / Skipped
- T5 (fresh Debian 13 VM install test) — skipped on this dry run; required before public-flip on GitHub.
- macOS install validation — needs a Mac with brew. Formula syntax was not pre-checked because steel141 has no ruby installed. Run `brew install seth/tap/glabels-qt` on a Mac to verify.
## Suggested Next Steps
1. Periodic upstream rebase + new release: when upstream tags a new master version, follow the spec §6 release flow to publish a new sethLabels-N tag.
2. T5 fresh-VM smoke test: spin up a clean Debian 13 VM, download the .deb from the release page, install with `apt install ./...`, run `glabels-qt --version`. If anything fails, the `dpkg-shlibdeps` calculation was wrong (spec §F8) — override via `CPACK_DEBIAN_PACKAGE_DEPENDS` and rebuild as -seth2.
3. macOS validation on a real Mac — first-install path validates the formula end-to-end.
4. Public-flip planning: when the pipeline has been battle-tested with a few releases, mirror to GitHub and add a `.github/workflows/release.yml` that calls the same scripts unmodified.
## Important Context
- Strict-zero (I1) is the project's defining discipline. The guardrail at `scripts/check-no-upstream-edits.sh` (with the upstream/master ref existence check added in commit 0631c55) enforces this on every build.
- The `<upstream-tag>-seth<N>` versioning means the next release on the same upstream commit will be `<upstream-tag>-seth2`. If upstream tags a new release first, it'll be `<new-tag>-seth1`.
- Spec discrepancy fixes applied during implementation (documented in plan header):
1. Added `-D CPACK_PACKAGE_NAME=glabels-qt` to build-deb.sh (spec §5.2 omitted it)
2. Pinned linuxdeploy/plugin-qt to dated tags (spec §F9 mandate; specific tags discovered at impl time)
3. Pruned each AppImage to contain only its own binary (size optimization not in spec, found via review)
- One unanticipated detail at release time: the homebrew-tap repo's pre-commit `detect-secrets` hook flagged the git revision SHA in `Formula/glabels-qt.rb` as a high-entropy string. Resolved with an inline `# pragma: allowlist secret` comment on that line — NOT with `--no-verify`. Future tap bumps need to keep that pragma comment when replacing the SHA.
## Tags now live in sethLabels
```
3.99-master618-seth1 ← first sethLabels release
3.99-master618 ← upstream-side checkpoints (pushed during this session as a side
3.99-master602 effect of `git push origin main --tags`; harmless, pre-existing
3.99-master601 local tags from upstream's history)
3.99-master598
```
---
**Security Reminder**: No secrets present. Validated post-write.
+25
View File
@@ -40,3 +40,28 @@ TEST-DATA
SAV* SAV*
OLD* OLD*
# === sethLabels (deployment fork) additions ===
# Local backup snapshots (per ~/.claude/CLAUDE.md safety rule)
.backup/
# Local-only symlink to ~/bin/GITEA_API.md (target is outside the repo)
GITEA_API.md
# Secrets / env
.env
.env.*
# Handoff drafts (operator scratch — final handoffs ARE committed)
.claude/handoffs/*.draft.md
# Build outputs (out-of-tree)
build/
# linuxdeploy + plugin caches (downloaded by scripts/lib/linuxdeploy.sh on first AppImage build)
scripts/.cache/
# Locally-produced AppImage artifacts
*.AppImage
# Bats test scratch directories (created/cleaned per test)
.test-scratch/
+29
View File
@@ -0,0 +1,29 @@
# sethLabels
> Deployment fork of glabels-qt — Qt label designer/printer, packaged for Seth's homelab.
## Start Here
**Read the latest handoff first:** `.claude/handoffs/` (most recent file).
It has session state, in-progress work, and ordered next steps.
Then check `IDEA.md` for the project brief and `DECISIONS.md` for settled choices.
## Project Identity
sethLabels is a thin deployment fork of [glabels-qt](https://github.com/j-evins/glabels-qt). Upstream is the real project — this fork's job is to keep a known-good build recipe, any deployment glue (packaging, install paths, default templates), and any local patches in one place, while staying close enough to upstream `master` that periodic rebases stay cheap.
## Current State
- **Phase:** post-first-release. Pipeline live. First tag: 3.99-master618-seth1. Three artifacts attached to the Gitea release. Brew tap bumped to match.
- **Repo:** `git.sethpc.xyz/Seth/sethLabels` (default branch `main`). Tap: `git.sethpc.xyz/Seth/homebrew-tap`. Upstream: `j-evins/glabels-qt` (`upstream` remote).
- **Deploy targets live:** Debian-family Linux (`.deb` + AppImage) and macOS via Homebrew tap.
- **Next release:** rebase, build, tag, attach, bump tap. See `scripts/README.md` and spec §6.
## Conventions
- This is a **deployment fork**, not a real fork. The discipline is **strict zero source patches** — no upstream-tracked file is ever edited. All sethLabels content lives in NEW top-level dirs (`scripts/`, `packaging/`, `sethlabels-docs/`, `tests-impl/`, `.claude/`). Allowlist exception: `.gitignore` (one-time scaffold-time touch).
- Enforced by `scripts/check-no-upstream-edits.sh` — runs as the first step of every build script, also catches working-tree drift, aborts if `upstream/master` ref is missing.
- Preserve upstream license (GPL-3.0) and copyright headers — strict-zero handles this automatically by never touching upstream files.
- Versioning: `<upstream-tag>-seth<N>` (e.g., `3.99-master618-seth1`). See spec §D4 + §5.4.
- See `~/bin/CLAUDE.md` for global homelab conventions (gitea CLI, conventional commits, credentials handling).
+41
View File
@@ -0,0 +1,41 @@
# DECISIONS.md — sethLabels Decision Log
Project-specific decisions. For global/cross-cutting decisions, see `~/bin/DECISIONS.md`.
Format: `YYYY-MM-DD: <decision> — <why>`
## Architecture
- **2026-04-29: Strict-zero source patches.** Never edit any upstream-tracked file. All sethLabels content lives in new files in new top-level directories at the repo root. — Makes `git pull upstream master --ff-only` succeed forever; rebase friction = 0. Allowlist exception: `.gitignore` (one-time scaffold-time touch). Enforced by `scripts/check-no-upstream-edits.sh`. See spec §I1, §D5.
- **2026-04-29: Eventual-public fork.** sethLabels stays on Gitea during battle-test, then promotes to a formally public fork on GitHub once the build/release pipeline is solid. — Drives spec invariants: build host must be a clean Debian 13 / Ubuntu LTS box (not steel141-specific); brew tap source URL must be cleanly flippable Gitea→GitHub; CI is added at the flip, not before.
- **2026-04-29: Linux artifacts = `.deb` + AppImage; macOS via Homebrew tap (build from source).** — `.deb` for Debian-family install ergonomics, AppImage for portability to non-Debian Linux. Brew tap eliminates macOS CI/signing/$99 Apple Dev ID entirely; users' Macs build from source. See spec §D1, §D2.
- **2026-04-29: Build infrastructure = manual local builds during battle-test.** Shell scripts under `scripts/` are the canonical build recipe; CI YAML at the public-flip will call those scripts unmodified. — Local feedback loop beats CI loop during iteration on packaging. Defers infra cost. See spec §I3, §D3.
- **2026-04-29: Versioning = `<upstream-tag>-seth<N>`.** E.g., `3.99-master618-seth1`. — Lineage-preserving; rebuild counter survives packaging-only fixes; sorts correctly under `dpkg --compare-versions`. See spec §D4.
- **2026-04-29: Package name = `glabels-qt`.** Same name as upstream binary, brew formula, and the command users run. — sethLabels identity lives at repo level + version-string `-seth<N>` marker, not in the package name. Avoids confusing identity-split between package name and binary name. See spec §D6.
## Implementation
- **2026-04-29: macOS = no CI required.** Homebrew tap with build-from-source means no macOS runner, no Apple Developer ID, no notarization pipeline. Tap repo (`git.sethpc.xyz/Seth/homebrew-tap`) is one ~30-line Ruby file. — Major simplification; Mac users build locally on first install (~510 min), all subsequent installs are version pin bumps to the tap formula.
- **2026-04-29: Debian-family is the install target, not steel141.** Build host happens to be steel141 (or any clean Debian/Ubuntu box); install target is generic Debian-family. — No homelab paths, hostnames, or assumptions in scripts. Reproducibility on a fresh VM is the bar.
- **2026-04-29: Spec, scripts, and packaging metadata live in NEW top-level dirs.** `sethlabels-docs/`, `scripts/`, `packaging/`. NOT in upstream's `docs/` directory. — Clear fork boundary; preserves strict-zero spirit (don't pollute upstream namespaces with our content).
- **2026-04-29: macOS Launchpad/Spotlight integration via stub `.app` wrapper generated in brew formula.** Formula's `def install` synthesizes `glabels-qt.app/Contents/{Info.plist, MacOS/launcher, Resources/glabels-qt.icns}` after `cmake --install`. Launcher is a 2-line shell that `exec`s the real CLI binary. Icon converted from upstream's SVG via `sips`. User runs a one-time `cp -R "$(brew --prefix glabels-qt)/glabels-qt.app" /Applications/` (caveats block reminds them). — Upstream's `add_executable(glabels-qt WIN32 ...)` has no `MACOSX_BUNDLE` keyword, so cmake produces a CLI-only Mach-O on macOS. Strict-zero forbids patching upstream to fix this. The brew-formula-side stub is the cleanest sethLabels-side workaround; no Apple Developer ID, no signing pipeline, no .dmg. Tap commits `ef4d6c7` (initial wrapper) + `3542762` (SVG glob fix).
## Deferred / Rejected
<!-- Decisions NOT to do something are just as valuable -- prevents re-proposing rejected ideas -->
- **Rejected 2026-04-29: AppImage-only Linux distribution.** — Loses native Debian package manager integration (`apt remove`, dependency tracking) on the primary target distros.
- **Rejected 2026-04-29: `.deb`-only Linux distribution.** — Loses portability to non-Debian Linux (RHEL/Fedora/Arch users couldn't install without recompiling).
- **Rejected 2026-04-29: Flatpak.** — Sandbox runtime requirement + manifest complexity overkill for a personal-use packaging fork.
- **Rejected 2026-04-29: Signed + notarized macOS `.dmg` (Apple Developer ID).** — $99/year recurring + notarization CI complexity not justified for a build-from-source Homebrew alternative.
- **Rejected 2026-04-29: Unsigned macOS `.dmg`.** — Gatekeeper friction (right-click → Open) is a poor first-run experience compared to brew install.
- **Rejected 2026-04-29: Gitea Actions self-hosted runner during battle-test.** — Homelab CT spin-up + workflow YAML setup not justified before public-flip; manual builds are faster to iterate on.
- **Rejected 2026-04-29: Public GitHub Actions from day one.** — Skips the "battle-test in private" intent; want to validate the pipeline before going public.
- **Rejected 2026-04-29: Plain upstream-tag versioning (no `-seth<N>` marker).** — No way to distinguish v1 of the `.deb` from v2 after a packaging fix; would have to lie about which upstream commit the package contains.
- **Rejected 2026-04-29: Independent semver (`0.1.0`, `0.2.0`).** — Loses upstream-lineage info from the version string; users couldn't tell which glabels-qt commit they have without checking the changelog.
- **Rejected 2026-04-29: Date-based versioning (`2026.04.29`).** — Loses both upstream-lineage and rebuild-counter information.
- **Rejected 2026-04-29: Permissive small-patches policy on upstream files.** — Creates rebase friction on each `git pull upstream master`; even a one-file CMakeLists carve-out turned out to be unnecessary since CPack `-D` flags cover all needed metadata at build time.
- **Rejected 2026-04-29: Package name `sethlabels`.** — Strict-zero policy forbids renaming the executable, so `apt install sethlabels` then running `glabels-qt` would split package identity from binary identity. Confusing.
- **Deferred: Windows packaging.** — Per project brief. Upstream's NSIS support is intact; can be revisited later. Not blocking macOS+Linux delivery.
- **Deferred: Custom default templates baked into the package.** — Strict-zero forbids; user-specific templates can live in `~/.config/glabels-qt/templates/` or a separate repo if/when needed.
- **Deferred: Branding, icon, splash, or string changes.** — Strict-zero forbids. sethLabels is a packaging fork, not a rebrand.
- **Deferred: Distribution to Debian backports / PPA / Ubuntu universe.** — Requires Debian Developer mentorship + ongoing policy compliance work; not justified for current scope.
+21
View File
@@ -0,0 +1,21 @@
# IDEA.md — Project Idea
## What is this?
sethLabels is a deployment fork of [glabels-qt](https://github.com/j-evins/glabels-qt) — a Qt-based desktop application for designing and printing labels, business cards, and similar small-format documents (with CSV mail-merge and barcode support).
The fork exists to layer Seth's deployment-specific concerns (packaging, install paths, default templates, branding, any local patches) on top of upstream without forking the whole project lifecycle. Goal is to keep the diff small enough to rebase onto upstream `master` periodically.
## Problem it solves
Need a reliable, scriptable label designer/printer for homelab + household use (shipping labels, equipment tags, drive labels for the tank pool, cable labels, etc.). Upstream glabels-qt is solid but has no published Debian 13 / current-Ubuntu binaries and the build needs some hand-holding. This fork bakes a known-good build recipe + any local templates + deployment scripts into one repo.
## Constraints / preferences
- **Upstream:** https://github.com/j-evins/glabels-qt (track this, don't drift). The glabels.org team are the real authors — strict-zero source-patch policy preserves their attribution end-to-end.
- **Stack:** Qt6 6.2 + CMake + C++ (confirmed by reading upstream `CMakeLists.txt:119`).
- **Target install hosts:** any Debian-family Linux (Debian 13 / Ubuntu LTS) for `.deb` + AppImage; any macOS for Homebrew tap. Steel141 is a *build host*, not a deploy target. CT for headless print serving optional/later. Windows deferred.
- **Branding/customization:** zero — this is a packaging fork, not a rebrand. Strict-zero policy forbids icon/string/UI edits.
- **License:** glabels-qt is GPL-3.0 — preserved automatically (we never touch upstream files).
- **Repo:** live at `git.sethpc.xyz/Seth/sethLabels`. Eventually-public on GitHub once the build/release pipeline is battle-tested.
- **Eventual public-flip:** when promoted to a formal public fork on GitHub, brew tap source URL flips Gitea→GitHub (one-line tap formula edit), and CI is added via GitHub Actions calling the same `scripts/` shell scripts unmodified.
+3 -2
View File
@@ -34,13 +34,14 @@ There are currently no official releases of gLabels 4.
Currently there are no self-hosted binary snapshot releases available. I plan to make these available again once 4.0 is more imminent. In the mean time, I encourage you to try building the code yourself. Currently there are no self-hosted binary snapshot releases available. I plan to make these available again once 4.0 is more imminent. In the mean time, I encourage you to try building the code yourself.
Some third-party packages may be available available: Some third-party packages may be available:
| Platform | Files | Notes | | Platform | Files | Notes |
|:----------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------| |:----------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------|
| Archlinux | [Archlinux User Repository Page](https://aur.archlinux.org/packages/glabels-qt-git/) | Maintained by [Mario Blättermann](https://github.com/mariobl) | | Archlinux | [Archlinux User Repository Page](https://aur.archlinux.org/packages/glabels-qt-git/) | Maintained by [Maud Spierings](https://github.com/SpieringsAE) |
| Ubuntu | [PPA Page](https://code.launchpad.net/~krisives/+archive/ubuntu/glabels-qt) | Maintained by [Kristopher Ives](https://github.com/krisives) | | Ubuntu | [PPA Page](https://code.launchpad.net/~krisives/+archive/ubuntu/glabels-qt) | Maintained by [Kristopher Ives](https://github.com/krisives) |
| Fedora | [Copr Repository Page](https://copr.fedorainfracloud.org/coprs/mariobl/glabels-qt/) | Maintained by [Mario Blättermann](https://github.com/mariobl) |
+93
View File
@@ -0,0 +1,93 @@
# sethLabels
> Deployment fork of [glabels-qt](https://github.com/j-evins/glabels-qt) — Qt6
> label designer / printer, packaged for Debian-family Linux and macOS.
This is **not** a code fork. The upstream application is unchanged; sethLabels
exists solely to publish installable binary artifacts that upstream explicitly
does not provide ("Currently there are no self-hosted binary snapshot releases
available… I encourage you to try building the code yourself" — upstream README).
For the application itself — what it does, screenshots, full feature list — see
the upstream [`README.md`](README.md).
## Install
### Debian / Ubuntu (`.deb`)
Download the latest `.deb` from the [releases page](https://git.sethpc.xyz/Seth/sethLabels/releases),
then:
```
sudo apt install ./glabels-qt_<VERSION>_amd64.deb
glabels-qt --version
```
### Any Linux (AppImage)
Download `sethlabels-gui-<VERSION>-x86_64.AppImage` from the [releases page](https://git.sethpc.xyz/Seth/sethLabels/releases),
make it executable, and run it:
```
chmod +x sethlabels-gui-<VERSION>-x86_64.AppImage
./sethlabels-gui-<VERSION>-x86_64.AppImage
```
A separate `sethlabels-batch-<VERSION>-x86_64.AppImage` provides the CLI for
scripted / mail-merge use.
### macOS (Homebrew)
```
brew tap seth/tap https://git.sethpc.xyz/Seth/homebrew-tap.git
brew install seth/tap/glabels-qt
```
The explicit URL form is needed because brew defaults to GitHub for tap names.
First install builds Qt6 + glabels-qt from source (~510 min one-time cost; see
spec §D2). Subsequent updates are a fast `brew upgrade`.
## Build from source
If you'd rather build the artifacts yourself instead of downloading a release:
```
git clone https://git.sethpc.xyz/Seth/sethLabels.git
cd sethLabels
git remote add upstream https://github.com/j-evins/glabels-qt.git
git fetch upstream
./scripts/lib/deps-debian.sh # check / install build deps
./scripts/build-deb.sh # → build/deb/glabels-qt_*.deb
./scripts/build-appimages.sh # → sethlabels-{gui,batch}-*.AppImage
```
See [`scripts/README.md`](scripts/README.md) for full operator docs.
## How this fork works
sethLabels is a **deployment fork**: every sethLabels addition lives in NEW
files in NEW top-level directories (`scripts/`, `packaging/`,
`sethlabels-docs/`, `tests-impl/`, plus this file). Upstream files are never
edited. The single allowlisted exception is `.gitignore`. This discipline is
enforced by `scripts/check-no-upstream-edits.sh`.
The `<upstream-tag>-seth<N>` versioning preserves the upstream-lineage in every
artifact. Periodic `git rebase upstream/master` is conflict-free by construction.
## Spec & decisions
- [Design spec](sethlabels-docs/specs/2026-04-29-packaging-design.md) — invariants, decisions, build pipeline, failure modes
- [Decision log](DECISIONS.md) — settled choices + rejected alternatives
- [Project brief](IDEA.md) — plain-language motivation
## License
The upstream code is licensed under [GPL-3.0](LICENSE). sethLabels-specific
files (everything in the dirs listed above, plus this file) are licensed under
the same terms.
## Upstream
- Upstream: https://github.com/j-evins/glabels-qt (Jaye Evins / glabels.org)
- This fork: https://git.sethpc.xyz/Seth/sethLabels
- Brew tap: https://git.sethpc.xyz/Seth/homebrew-tap
+1 -1
View File
@@ -1,6 +1,6 @@
// Backends.cpp // Backends.cpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Backends.hpp // Backends.hpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// GnuBarcode.cpp // GnuBarcode.cpp
// //
// Copyright (C) 2017 Jaye Evins <evins@snaught.com> // Copyright (C) 2017-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// GnuBarcode.hpp // GnuBarcode.hpp
// //
// Copyright (C) 2017 Jaye Evins <evins@snaught.com> // Copyright (C) 2017-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// QrEncode.cpp // QrEncode.cpp
// //
// Copyright (C) 2017 Jaye Evins <evins@snaught.com> // Copyright (C) 2017-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// QrEncode.hpp // QrEncode.hpp
// //
// Copyright (C) 2017 Jaye Evins <evins@snaught.com> // Copyright (C) 2017-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Style.cpp // Style.cpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Style.hpp // Style.hpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Zint.cpp // Zint.cpp
// //
// Copyright (C) 2017 Jaye Evins <evins@snaught.com> // Copyright (C) 2017-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Zint.hpp // Zint.hpp
// //
// Copyright (C) 2017 Jaye Evins <evins@snaught.com> // Copyright (C) 2017-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Factory.cpp // Merge/Factory.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Factory.hpp // Merge/Factory.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Merge.cpp // Merge/Merge.cpp
// //
// Copyright (C) 2015-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2015-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Merge.hpp // Merge/Merge.hpp
// //
// Copyright (C) 2015-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2015-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/None.cpp // Merge/None.cpp
// //
// Copyright (C) 2015-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2015-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/None.hpp // Merge/None.hpp
// //
// Copyright (C) 2015-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2015-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Record.cpp // Merge/Record.cpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Record.hpp // Merge/Record.hpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Text.cpp // Merge/Text.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/Text.hpp // Merge/Text.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextColon.cpp // Merge/TextColon.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextColon.hpp // Merge/TextColon.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextColonKeys.cpp // Merge/TextColonKeys.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextColonKeys.hpp // Merge/TextColonKeys.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextCsv.cpp // Merge/TextCsv.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextCsv.hpp // Merge/TextCsv.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextCsvKeys.cpp // Merge/TextCsvKeys.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextCsvKeys.hpp // Merge/TextCsvKeys.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextSemicolon.cpp // Merge/TextSemicolon.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextSemicolon.hpp // Merge/TextSemicolon.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextSemicolonKeys.cpp // Merge/TextSemicolonKeys.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextSemicolonKeys.hpp // Merge/TextSemicolonKeys.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextTsv.cpp // Merge/TextTsv.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextTsv.hpp // Merge/TextTsv.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextTsvKeys.cpp // Merge/TextTsvKeys.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Merge/TextTsvKeys.hpp // Merge/TextTsvKeys.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -26,7 +26,7 @@ How To Contribute to gLabels
### Would you like to submit new product templates? ### Would you like to submit new product templates?
* Before submitting, please read [PRODUCT-TEMPLATES.md](PRODUCT-TEMPLATES.md) located in this directory. * Before submitting, please read [PRODUCT-TEMPLATES.md](PRODUCT-TEMPLATES.md) and [TEMPLATE-STYLE.md](TEMPLATE-STYLE.md) located in this directory.
* [Open an issue](https://github.com/j-evins/glabels-qt/issues/new) and attach your completed product template file(s). * [Open an issue](https://github.com/j-evins/glabels-qt/issues/new) and attach your completed product template file(s).
+4 -2
View File
@@ -1,7 +1,9 @@
Manually Creating Product Templates Manually Creating Product Templates
=================================== ===================================
This document is a reference for manually creating *gLabels* product templates. This document is a reference for manually creating *gLabels* product templates. See
[TEMPLATE-STYLE.md](TEMPLATE-STYLE.md) located in this directory for style guidelines
for product template submissions.
*gLabels* searches for templates in several locations as described here:</p> *gLabels* searches for templates in several locations as described here:</p>
@@ -83,7 +85,7 @@ Property | Type | Description
*_description* | string | Translatable description of stationery product. Used in predefined labels instead of description. *_description* | string | Translatable description of stationery product. Used in predefined labels instead of description.
*width* | distance | Page width. Only valid if `size="other"` or `size="roll"`. *width* | distance | Page width. Only valid if `size="other"` or `size="roll"`.
*height* | distance | Page height. Only valid if `size="other"`. Value is ignored if `size="roll"`. *height* | distance | Page height. Only valid if `size="other"`. Value is ignored if `size="roll"`.
*equiv* | string | Equivalent part number. If this property is present, the template is a clone of another template of the same brand. The template will inherit all properties, except brand and name from the other template. This equiv property must refer to a previously defined template - *gLabels* does not currently support forward references. *equiv* | string | Equivalent part number. If this property is present, the template is a clone of another template of the same brand. The template will inherit all properties, except *part* from the other template. This equiv property must refer to a previously defined template - *gLabels* does not currently support forward references.
### Guidelines for Creating Product Descriptions ### Guidelines for Creating Product Descriptions
+120
View File
@@ -0,0 +1,120 @@
gLabels Product Template Style Guide
====================================
This file describes the prefered style for product template submissions. See
[PRODUCT-TEMPLATES.md](PRODUCT-TEMPLATES.md) located in this directory for detailed
systax documentation.
Organization
------------
Template files are located in the [templates](../templates/) directory. The following
is the naming convention for these files:
<pre><i>brand</i>-<i>class</i>-templates.xml</pre>
Where *brand* is the lowercase brand name, and *class* is the media size class (currently
`iso`, `us`, and `other`).
Templates should be sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order)
by part number within each file. An exception to this rule is to group equivalent templates
directly below their referenced template. For example:
```xml
<Template brand="Avery" part="5126" size="US-Letter" _description="Shipping labels">
<Meta category="label"/>
<Meta category="rectangle-label"/>
<Meta category="mail"/>
<Label-rectangle id="0" width="8.5in" height="5.5in" round="0in" x_waste="0in" y_waste="0in">
<Markup-margin size="9pt"/>
<Layout nx="1" ny="2" x0="0in" y0="0in" dx="0in" dy="5.5in"/>
</Label-rectangle>
</Template>
<Template brand="Avery" part="5526" equiv="5126"/>
<Template brand="Avery" part="8126" equiv="5126"/>
<Template brand="Avery" part="15516" equiv="5126"/>
<Template brand="Avery" part="18126" equiv="5126"/>
<Template brand="Avery" part="5159" size="US-Letter" _description="Address labels">...
```
When creating a new template file, it must be added to the variable template_files in
the [CMakeLists.txt](../templates/CMakeLists.txt) file in this same directory.
*Template* Node Attributes
--------------------------
### *brand* Attribute
This is the brand name or manufacturer of the product. It must match one of the vendors
in the [vendors.xml](../templates/vendors.xml) file. Add a new vendor line if it does not
currently exist.
### *part* Attribute
This is the actual part number of the product. This is usually a short set of numbers and/or
letters. This is not a description or name of the product. The following are examples
of part numbers:
- `5160`
- `WL-102`
- `J8435B`
Sometimes a product includes multiple label types, either as separate sheets or different
types of labels on the same sheet. In these cases, providing a short suffix to part number
is acceptable. For example:
- `3274.1`, `3274.2`, and `3274.3`
- `5931-Disc`, and `5931-Spine`
### *_description* Attribute
- Descriptions should be short. They should describe what the product is in very simple terms
without being too detailed. They should not describe details such as size, quantity, layout,
color, or material. The description should not include brand or part number information.
Size, quantity, layout, brand, and part number are described by other elements of the
template - do not repeat them in the description.
- If at all possible, try to reuse descriptions from other templates (this keeps the
number of unique strings that need translation to a minimum).
- Don't repeat the brand or part number in the description.
- Only capitalize the first word of the description.
The following are good bad descriptions:
| description | Good/Bad | Notes |
|:-------------------------|:--------:|:----------------------------------------------|
| `Address labels` | ✅ | |
| `Address Labels` | ❌ | Capitalized second word of description. |
| `Business cards` | ✅ | |
| `Multipurpose labels` | ✅ | |
| `CD/DVD labels` | ✅ | |
| `19mm x 30mm labels` | ❌ | Don't include size information. |
| `Labels 15 per sheet` | ❌ | Don't include layout or quantity information. |
| `Dymo continuous labels` | ❌ | Don't include brand or part number. |
*Meta* Node Attributes
----------------------
### *category* Attribute
- All templates should include all appropriate `<Meta category=...` nodes.
- Categories must match one of the existing categories in the [categories.xml](../templates/categories.xml) file. Do not add new categories!
- All templates should include either a `<Meta category="label"/>` or `<Meta category="card"/>` node.
### *product_url* Attribute
Unfortunately, manufacturer websites are constantly being updated and rearranged, rendering such deep URLs obsolete very quickly. Therefore,
use of this attribute is deprecated.
+11 -1
View File
@@ -39,7 +39,7 @@ To Do List for gLabels 4.0 -- 2019-10-07
To Do List for post gLabels 4.0 -- 2019-03-17 To Do List for post gLabels 4.0 -- 2026-02-18
============================================= =============================================
- [ ] Create a "built-in" merge source - [ ] Create a "built-in" merge source
@@ -71,4 +71,14 @@ To Do List for post gLabels 4.0 -- 2019-03-17
The current built-in fixed margin seems to confuse people when dealing with The current built-in fixed margin seems to confuse people when dealing with
different horizontal and vertical alignments. different horizontal and vertical alignments.
- [ ] Add support for arbitrary DPI when defining templates. Some label
printers use native units in their label specifications (e.g. pins, pixels, etc.)
This would look something like this
`... dpi="300" ... width="525d" height="350d" ...`
These would be converted to model::Distance when parsing.
- [ ] Resurrect the evolution and vcard backends. This would be optional based
on availability.
+7 -2
View File
@@ -1,4 +1,9 @@
## Translation management # Translations
We manage all translations within a [transifex](https://explore.transifex.com/glabels/). Please don't send your files via Github, use only transifex. The translations of the user interface, the template database and the user manual (which is still under development)
are maintained at [Fedora Weblate](https://translate.fedoraproject.org/projects/glabels-qt/). Please always use
Weblate for translation submissions; we do not accept contributions from outside this platform. For more information about
using Weblate, read the [documentation](https://docs.weblate.org/en/latest/).
To contribute to translations, you need an account in the [Fedora Account System](https://accounts.fedoraproject.org/).
More information about the account system can be found [here](https://docs.fedoraproject.org/en-US/fedora-accounts/).
+1 -1
View File
@@ -1,6 +1,6 @@
// main.cpp // main.cpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+2 -2
View File
@@ -1,6 +1,6 @@
// AboutDialog.cpp // AboutDialog.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
@@ -43,7 +43,7 @@ namespace glabels
QString description = tr("A program to create labels and business cards."); QString description = tr("A program to create labels and business cards.");
QString copyright = "Copyright &copy; 2018 Jaye Evins <evins@snaught.com>"; QString copyright = "Copyright &copy; 2016-2026 Jaye Evins <evins@snaught.com>";
QString licenseParagraph1 = QString licenseParagraph1 =
tr( "gLabels is free software: you can redistribute it and/or modify " tr( "gLabels is free software: you can redistribute it and/or modify "
+1 -1
View File
@@ -1,6 +1,6 @@
// AboutDialog.hpp // AboutDialog.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// BarcodeMenu.cpp // BarcodeMenu.cpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// BarcodeMenu.hpp // BarcodeMenu.hpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// BarcodeMenuButton.cpp // BarcodeMenuButton.cpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// BarcodeMenuButton.hpp // BarcodeMenuButton.hpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// BarcodeMenuItem.cpp // BarcodeMenuItem.cpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// BarcodeMenuItem.hpp // BarcodeMenuItem.hpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorButton.cpp // ColorButton.cpp
// //
// Copyright (C) 2014-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorButton.hpp // ColorButton.hpp
// //
// Copyright (C) 2014-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorHistory.cpp // ColorHistory.cpp
// //
// Copyright (C) 2014-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorHistory.hpp // ColorHistory.hpp
// //
// Copyright (C) 2014-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorPaletteDialog.cpp // ColorPaletteDialog.cpp
// //
// Copyright (C) 2014-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorPaletteDialog.hpp // ColorPaletteDialog.hpp
// //
// Copyright (C) 2014-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorPaletteItem.cpp // ColorPaletteItem.cpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorPaletteItem.hpp // ColorPaletteItem.hpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorSwatch.cpp // ColorSwatch.cpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ColorSwatch.hpp // ColorSwatch.hpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Cursors.cpp // Cursors.cpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Cursors.hpp // Cursors.hpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// EditVariableDialog.cpp // EditVariableDialog.cpp
// //
// Copyright (C) 2019 Jaye Evins <evins@snaught.com> // Copyright (C) 2019-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// EditVariableDialog.hpp // EditVariableDialog.hpp
// //
// Copyright (C) 2019 Jaye Evins <evins@snaught.com> // Copyright (C) 2019-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// FieldButton.cpp // FieldButton.cpp
// //
// Copyright (C) 2019 Jaye Evins <evins@snaught.com> // Copyright (C) 2019-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// FieldButton.hpp // FieldButton.hpp
// //
// Copyright (C) 2019 Jaye Evins <evins@snaught.com> // Copyright (C) 2019-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// File.cpp // File.cpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// File.hpp // File.hpp
// //
// Copyright (C) 2017 Jaye Evins <evins@snaught.com> // Copyright (C) 2017-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Help.cpp // Help.cpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Help.hpp // Help.hpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// LabelEditor.cpp // LabelEditor.cpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// LabelEditor.hpp // LabelEditor.hpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MainWindow.cpp // MainWindow.cpp
// //
// Copyright (C) 2014-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MainWindow.hpp // MainWindow.hpp
// //
// Copyright (C) 2014 Jaye Evins <evins@snaught.com> // Copyright (C) 2014-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MergeTableModel.cpp // MergeTableModel.cpp
// //
// Copyright (C) 2025 Jaye Evins <evins@snaught.com> // Copyright (C) 2025-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MergeTableModel.hpp // MergeTableModel.hpp
// //
// Copyright (C) 2025 Jaye Evins <evins@snaught.com> // Copyright (C) 2025-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MergeView.cpp // MergeView.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MergeView.hpp // MergeView.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MiniPreviewPixmap.cpp // MiniPreviewPixmap.cpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// MiniPreviewPixmap.hpp // MiniPreviewPixmap.hpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// NotebookUtil.cpp // NotebookUtil.cpp
// //
// Copyright (C) 2015 Jaye Evins <evins@snaught.com> // Copyright (C) 2015-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// NotebookUtil.hpp // NotebookUtil.hpp
// //
// Copyright (C) 2015 Jaye Evins <evins@snaught.com> // Copyright (C) 2015-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ObjectEditor.cpp // ObjectEditor.cpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// ObjectEditor.hpp // ObjectEditor.hpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// PreferencesDialog.cpp // PreferencesDialog.cpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// PreferencesDialog.hpp // PreferencesDialog.hpp
// //
// Copyright (C) 2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2016-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Preview.cpp // Preview.cpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// Preview.hpp // Preview.hpp
// //
// Copyright (C) 2013-2016 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// PreviewOverlayItem.cpp // PreviewOverlayItem.cpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //
+1 -1
View File
@@ -1,6 +1,6 @@
// PreviewOverlayItem.hpp // PreviewOverlayItem.hpp
// //
// Copyright (C) 2013 Jaye Evins <evins@snaught.com> // Copyright (C) 2013-2026 Jaye Evins <evins@snaught.com>
// //
// This file is part of gLabels-qt. // This file is part of gLabels-qt.
// //

Some files were not shown because too many files have changed in this diff Show More