Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Changelog

## Unreleased
- Add filament label printing with separate presets, QR codes, and AML export (labels and pages), plus AML size control and filament QR scanning support.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,15 @@ Spoolman is a self-hosted web service designed to help you efficiently manage yo

## Installation
Please see the [Installation page on the Wiki](https://github.com/Donkie/Spoolman/wiki/Installation) for details how to install Spoolman.

## Syncing Manufacturer Logos
If you want to bundle manufacturer logos locally for UI + label rendering, run:

```bash
./scripts/sync_vendor_logos.sh
```

This pulls the `logos` set from `MarksMakerSpace/filament-profiles` into `client/public/vendor-logos`.

In the Manufacturers list, use `Sync Logos` to auto-map existing manufacturers to bundled logos.
The matching normalizes casing and separators (for example `Bambu Lab`, `bambu-lab`, `BAMBU LAB`).
90 changes: 88 additions & 2 deletions client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"i18next": "^25.7.3",
"i18next-browser-languagedetector": "^8.2.0",
"i18next-http-backend": "^3.0.2",
"jszip": "3.10.1",
"react": "^19.2.3",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
Expand Down
127 changes: 119 additions & 8 deletions client/public/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"showArchived": "Show Archived",
"notAccessTitle": "You don't have permission to access",
"hideColumns": "Hide Columns",
"clearFilters": "Clear Filters"
"clearFilters": "Clear Filters",
"selectAll": "Select All",
"selectNone": "Select None"
},
"warnWhenUnsavedChanges": "Are you sure you want to leave? You have unsaved changes.",
"notifications": {
Expand Down Expand Up @@ -70,6 +72,7 @@
"paperSize": "Paper Size",
"customSize": "Custom",
"dimensions": "Dimensions",
"amlLabelSize": "AML Label Size",
"showBorder": "Show Border",
"previewScale": "Preview Scale",
"skipItems": "Skip Items",
Expand Down Expand Up @@ -100,15 +103,71 @@
"deleteSettingsConfirm": "Are you sure you want to delete this preset?",
"settingsName": "Preset Name",
"saveSetting": "Save Presets",
"saveAsImage": "Save as Image"
"savePreset": "Save Preset",
"saveAsImage": "Save as Image",
"saveAsAmlLabels": "Save as AML (Labels)",
"saveAsAmlPages": "Save as AML (Pages)",
"spoolImagePresets": "Spool Image Presets",
"filamentImagePresets": "Filament Image Presets",
"exportFormat": "Export Format",
"exportFormatOptions": {
"png": "PNG",
"aml": "AML"
},
"exportAsZip": "Export as .zip",
"exportDpi": "Export DPI",
"exportDpiHelp": "Higher DPI improves image quality for exports but increases file size.",
"exportLabels": "Export Labels",
"filenamePreview": "Filename Preview",
"filenamePreviewAdditional": "Additional Example",
"zipFilenamePreview": "ZIP Filename"
},
"qrcode": {
"button": "Print Labels",
"selectButton": "Print / Export Labels",
"exportButton": "Export Labels",
"selectTitle": "Export / Print Labels",
"exportFilamentTitle": "Export Filament Labels",
"exportSpoolTitle": "Export Spool Labels",
"printFilamentTitle": "Print Filament Labels",
"printSpoolTitle": "Print Spool Labels",
"title": "Label Printing",
"sectionLogo": "Logo",
"sectionTitle": "Title",
"sectionQRCode": "QR Code",
"sectionInformation": "Information",
"template": "Label Template",
"templateHelp": "Use {} to insert values of the spool object as text. For example, {id} will be replaced with the spool id, or {filament.material} will be replaced with the material of the spool. if a value is missing it will be replaced with \"?\". A second set of {} can be used to remove this. In addition, any text between the sets of {} will be removed if the value is missing. For example, {Lot Nr: {lot_nr}} will only show the label if the spool has a lot number. Enclose text with double asterix ** to make it bold. Click the button to view a list of all available tags.",
"titleTemplate": "Title Template",
"infoTemplate": "Information Template",
"templateHelp": "Use {} to insert values of the spool object as text. For example, {id} will be replaced with the spool id, or {filament.material} will be replaced with the material of the spool. if a value is missing it will be replaced with \"?\". A second set of {} can be used to remove this. In addition, any text between the sets of {} will be removed if the value is missing. For example, {Lot Nr: {lot_nr}} will only show the label if the spool has a lot number. Enclose text with double asterix ** to make it bold, and use ==text== to invert text. Click the button to view a list of all available tags.",
"templateHelpFilament": "Use {} to insert values of the filament object as text. For example, {id} will be replaced with the filament id, or {vendor.name} will be replaced with the vendor name. If a value is missing it will be replaced with \"?\". A second set of {} can be used to remove this. In addition, any text between the sets of {} will be removed if the value is missing. For example, {Article: {article_number}} will only show the label if a filament has an article number. Enclose text with double asterix ** to make it bold, and use ==text== to invert text. Click the button to view a list of all available tags.",
"textSize": "Label Text Size",
"showContent": "Print Label",
"infoTextSize": "Information Text Size",
"titleTextSize": "Title Text Size",
"titleMaxTextSize": "Title Max Text Size",
"titleAreaHeight": "Title Area Height",
"showContent": "Show Information on label",
"showManufacturerLogo": "Show Manufacturer Logo",
"showTitle": "Show Title",
"titleFitToWidth": "Fit Title to Width",
"titleFitToWidthOptions": {
"on": "On",
"off": "Off"
},
"appliedTextSize": "Applied Size",
"logoSize": "Logo Size",
"logoAlign": "Logo Horizontal Align",
"titleAlign": "Title Horizontal Align",
"qrCodePosition": "QR Code Position",
"qrCodePositionLeft": "Left",
"qrCodePositionRight": "Right",
"qrCodeAlign": "QR Code Vertical Align",
"qrCodeAlignTop": "Top",
"qrCodeAlignCenter": "Center",
"qrCodeAlignBottom": "Bottom",
"qrCodeSize": "QR Code Size",
"infoAlign": "Information Horizontal Align",
"infoVerticalAlign": "Information Vertical Align",
"useHTTPUrl": {
"label": "QR code link",
"tooltip": "Will use proprietary link that will work only if scanned from Spoolman's scanning feature (default). URL uses either the base URL specified in settings, or the current page URL if not set.",
Expand All @@ -123,16 +182,31 @@
"no": "No",
"simple": "Simple",
"withIcon": "With Icon"
}
},
"filenameTemplate": "Filename Template",
"filenameTemplateTooltipSpool": "Use {} to insert values of the spool object as text. Refer to the label template rules and available tags for details.",
"filenameTemplateTooltipFilament": "Use {} to insert values of the filament object as text. Refer to the label template rules and available tags for details.",
"titleTemplateTooltipSpool": "Use {} to insert values of the spool object as text. Refer to the label template rules and available tags for details.",
"titleTemplateTooltipFilament": "Use {} to insert values of the filament object as text. Refer to the label template rules and available tags for details."
},
"spoolSelect": {
"title": "Select Spools",
"description": "Select spools to print labels for.",
"searchPlaceholder": "Search vendor, name, material, lot #",
"showArchived": "Show Archived",
"noSpoolsSelected": "You have not selected any spools.",
"selectAll": "Select/Unselect All",
"selectedTotal_one": "{{count}} spool selected",
"selectedTotal_other": "{{count}} spools selected"
},
"filamentSelect": {
"title": "Select Filaments",
"description": "Select filaments to print labels for.",
"searchPlaceholder": "Search vendor, name, material, article #",
"noFilamentsSelected": "You have not selected any filaments.",
"selectAll": "Select/Unselect All",
"selectedTotal_one": "{{count}} filament selected",
"selectedTotal_other": "{{count}} filaments selected"
}
},
"scanner": {
Expand Down Expand Up @@ -226,6 +300,7 @@
"diameter": "Diameter",
"weight": "Weight",
"spool_weight": "Spool Weight",
"spool_count": "Spool Count",
"article_number": "Article Number",
"registered": "Registered",
"comment": "Comment",
Expand Down Expand Up @@ -269,14 +344,25 @@
"vendor": "Manufacturers",
"fields": {
"id": "ID",
"logo": "Logo",
"logo_url": "Logo URL",
"print_logo_url": "Print Logo URL",
"logo_preview": "Logo Preview",
"print_logo_preview": "Print Logo Preview",
"name": "Name",
"empty_spool_weight": "Empty Spool Weight",
"external_id": "External ID",
"registered": "Registered",
"comment": "Comment"
"comment": "Comment",
"logo_suggestions": "Logo Suggestions",
"print_logo_suggestions": "Print Logo Suggestions",
"logo_suggestions_placeholder": "Select a suggested logo path",
"logo_suggestions_none": "None"
},
"fields_help": {
"empty_spool_weight": "The weight of an empty spool from this manufacturer."
"empty_spool_weight": "The weight of an empty spool from this manufacturer.",
"logo_url": "Optional custom logo used in the UI. Supports absolute URLs or local paths like /vendor-logos/web/bambu-lab-web.png.",
"print_logo_url": "Optional custom logo used for label rendering. Supports absolute URLs or local paths like /vendor-logos/print/bambu-lab.png."
},
"titles": {
"create": "Create Manufacturer",
Expand All @@ -286,8 +372,16 @@
"show": "Show Manufacturer",
"show_title": "[Manufacturer #{{id}}] {{name}}"
},
"buttons": {
"sync_logos": "Sync Logos",
"clear_logo_url": "Clear URL"
},
"form": {
"vendor_updated": "This manufacturer has been updated by someone/something else since you opened this page. Saving will overwrite those changes!"
"vendor_updated": "This manufacturer has been updated by someone/something else since you opened this page. Saving will overwrite those changes!",
"logo_sync_no_match": "No matching logos found for this manufacturer name.",
"logo_sync_applied": "Suggested logo paths applied.",
"logo_preview_auto_notice": "using auto-matched logo from bundled logo pack",
"logo_preview_default_notice": "no logo defined, using default generated text logo"
}
},
"home": {
Expand Down Expand Up @@ -322,6 +416,23 @@
"round_prices": {
"label": "Round prices",
"tooltip": "Round prices to the nearest whole number."
},
"logo_sync": {
"title": "Global Manufacturer Logo Sync",
"description": "Syncs missing logo URLs across the whole manufacturer database using the bundled logo manifest. Existing logo URLs are not overwritten.",
"where": "Source: /vendor-logos/manifest.json (bundled static web/print logo files). Matching ignores minor punctuation/case differences in names.",
"button": "Sync Logos Now",
"not_ready": "Logo manifest is not available yet.",
"load_error": "Could not load manufacturers for logo sync.",
"done": "Logo sync complete. Matched {{matched}}, updated {{updated}}.",
"github_title": "Update Logo Pack from GitHub",
"github_description": "Checks the upstream logo repository for changes and downloads files only when there is a newer logo pack. No re-download happens when unchanged.",
"github_source": "Source repository:",
"github_button": "Check GitHub for Logo Updates",
"github_load_error": "Could not check GitHub logo updates.",
"github_done_updated": "Logo pack updated from GitHub. Web: {{web}}, Print: {{print}}.",
"github_done_no_changes": "Logo pack already up to date. Web: {{web}}, Print: {{print}}.",
"scope_note": "This action syncs the whole manufacturer database. You can sync a single manufacturer from its Edit page."
}
},
"extra_fields": {
Expand Down
Loading