gitextract_t40zu6xr/ ├── .codeql/ │ ├── codeql-config.yml │ ├── javascript-bambuddy.qls │ └── python-bambuddy.qls ├── .coverage ├── .dockerignore ├── .gitattributes ├── .github/ │ ├── CODEOWNERS │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── MAINTAINERS.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── workflows/ │ │ ├── ci.yml │ │ ├── cleanup-ghcr.yml │ │ ├── codeql.yml │ │ ├── issue-closed.yml │ │ ├── repo-stats.yml │ │ ├── security.yml │ │ └── stale.yml │ └── workflows.disabled/ │ └── ci.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .trivyignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DOCKERHUB.md ├── Dockerfile ├── Dockerfile.test ├── LICENSE ├── README.md ├── SECURITY.md ├── UPDATING.md ├── backend/ │ ├── __init__.py │ ├── app/ │ │ ├── __init__.py │ │ ├── api/ │ │ │ ├── __init__.py │ │ │ └── routes/ │ │ │ ├── __init__.py │ │ │ ├── ams_history.py │ │ │ ├── api_keys.py │ │ │ ├── archives.py │ │ │ ├── auth.py │ │ │ ├── background_dispatch.py │ │ │ ├── bug_report.py │ │ │ ├── camera.py │ │ │ ├── cloud.py │ │ │ ├── discovery.py │ │ │ ├── external_links.py │ │ │ ├── filaments.py │ │ │ ├── firmware.py │ │ │ ├── github_backup.py │ │ │ ├── groups.py │ │ │ ├── inventory.py │ │ │ ├── kprofiles.py │ │ │ ├── library.py │ │ │ ├── local_backup.py │ │ │ ├── local_presets.py │ │ │ ├── maintenance.py │ │ │ ├── metrics.py │ │ │ ├── mfa.py │ │ │ ├── notification_templates.py │ │ │ ├── notifications.py │ │ │ ├── obico.py │ │ │ ├── pending_uploads.py │ │ │ ├── print_log.py │ │ │ ├── print_queue.py │ │ │ ├── printers.py │ │ │ ├── projects.py │ │ │ ├── settings.py │ │ │ ├── smart_plugs.py │ │ │ ├── spoolbuddy.py │ │ │ ├── spoolman.py │ │ │ ├── support.py │ │ │ ├── system.py │ │ │ ├── updates.py │ │ │ ├── user_notifications.py │ │ │ ├── users.py │ │ │ ├── virtual_printers.py │ │ │ ├── webhook.py │ │ │ └── websocket.py │ │ ├── cli.py │ │ ├── core/ │ │ │ ├── __init__.py │ │ │ ├── auth.py │ │ │ ├── catalog_defaults.py │ │ │ ├── compat.py │ │ │ ├── config.py │ │ │ ├── database.py │ │ │ ├── db_dialect.py │ │ │ ├── encryption.py │ │ │ ├── permissions.py │ │ │ └── websocket.py │ │ ├── i18n/ │ │ │ └── __init__.py │ │ ├── main.py │ │ ├── models/ │ │ │ ├── __init__.py │ │ │ ├── active_print_spoolman.py │ │ │ ├── ams_history.py │ │ │ ├── ams_label.py │ │ │ ├── api_key.py │ │ │ ├── archive.py │ │ │ ├── auth_ephemeral.py │ │ │ ├── bug_report.py │ │ │ ├── color_catalog.py │ │ │ ├── external_link.py │ │ │ ├── filament.py │ │ │ ├── github_backup.py │ │ │ ├── group.py │ │ │ ├── kprofile_note.py │ │ │ ├── library.py │ │ │ ├── local_preset.py │ │ │ ├── maintenance.py │ │ │ ├── notification.py │ │ │ ├── notification_template.py │ │ │ ├── oidc_provider.py │ │ │ ├── orca_base_cache.py │ │ │ ├── pending_upload.py │ │ │ ├── print_batch.py │ │ │ ├── print_log.py │ │ │ ├── print_queue.py │ │ │ ├── printer.py │ │ │ ├── project.py │ │ │ ├── project_bom.py │ │ │ ├── settings.py │ │ │ ├── slot_preset.py │ │ │ ├── smart_plug.py │ │ │ ├── smart_plug_energy_snapshot.py │ │ │ ├── spool.py │ │ │ ├── spool_assignment.py │ │ │ ├── spool_catalog.py │ │ │ ├── spool_k_profile.py │ │ │ ├── spool_usage_history.py │ │ │ ├── spoolbuddy_device.py │ │ │ ├── user.py │ │ │ ├── user_email_pref.py │ │ │ ├── user_otp_code.py │ │ │ ├── user_totp.py │ │ │ └── virtual_printer.py │ │ ├── schemas/ │ │ │ ├── __init__.py │ │ │ ├── api_key.py │ │ │ ├── archive.py │ │ │ ├── auth.py │ │ │ ├── cloud.py │ │ │ ├── external_link.py │ │ │ ├── filament.py │ │ │ ├── github_backup.py │ │ │ ├── group.py │ │ │ ├── kprofile.py │ │ │ ├── library.py │ │ │ ├── local_preset.py │ │ │ ├── maintenance.py │ │ │ ├── notification.py │ │ │ ├── notification_template.py │ │ │ ├── print_log.py │ │ │ ├── print_queue.py │ │ │ ├── printer.py │ │ │ ├── project.py │ │ │ ├── settings.py │ │ │ ├── smart_plug.py │ │ │ ├── spool.py │ │ │ ├── spool_usage.py │ │ │ ├── spoolbuddy.py │ │ │ ├── timelapse.py │ │ │ └── user_notifications.py │ │ ├── services/ │ │ │ ├── __init__.py │ │ │ ├── archive.py │ │ │ ├── archive_comparison.py │ │ │ ├── background_dispatch.py │ │ │ ├── bambu_cloud.py │ │ │ ├── bambu_ftp.py │ │ │ ├── bambu_mqtt.py │ │ │ ├── bug_report.py │ │ │ ├── camera.py │ │ │ ├── discovery.py │ │ │ ├── email_service.py │ │ │ ├── export.py │ │ │ ├── external_camera.py │ │ │ ├── failure_analysis.py │ │ │ ├── firmware_check.py │ │ │ ├── firmware_update.py │ │ │ ├── github_backup.py │ │ │ ├── hms_errors.py │ │ │ ├── homeassistant.py │ │ │ ├── layer_timelapse.py │ │ │ ├── ldap_service.py │ │ │ ├── local_backup.py │ │ │ ├── mqtt_relay.py │ │ │ ├── mqtt_smart_plug.py │ │ │ ├── network_utils.py │ │ │ ├── notification_service.py │ │ │ ├── obico_actions.py │ │ │ ├── obico_detection.py │ │ │ ├── obico_smoothing.py │ │ │ ├── opentag3d.py │ │ │ ├── orca_profiles.py │ │ │ ├── plate_detection.py │ │ │ ├── print_log.py │ │ │ ├── print_scheduler.py │ │ │ ├── printer_manager.py │ │ │ ├── rest_smart_plug.py │ │ │ ├── smart_plug_manager.py │ │ │ ├── spool_assignment_notifications.py │ │ │ ├── spool_tag_matcher.py │ │ │ ├── spoolbuddy_ssh.py │ │ │ ├── spoolman.py │ │ │ ├── spoolman_tracking.py │ │ │ ├── stl_thumbnail.py │ │ │ ├── tasmota.py │ │ │ ├── timelapse_processor.py │ │ │ ├── usage_tracker.py │ │ │ └── virtual_printer/ │ │ │ ├── __init__.py │ │ │ ├── bind_server.py │ │ │ ├── certificate.py │ │ │ ├── ftp_server.py │ │ │ ├── manager.py │ │ │ ├── mqtt_server.py │ │ │ ├── ssdp_server.py │ │ │ └── tcp_proxy.py │ │ └── utils/ │ │ ├── color_utils.py │ │ ├── filament_ids.py │ │ ├── printer_models.py │ │ ├── tag_normalization.py │ │ └── threemf_tools.py │ └── tests/ │ ├── __init__.py │ ├── conftest.py │ ├── integration/ │ │ ├── __init__.py │ │ ├── test_advanced_auth_api.py │ │ ├── test_ams_history_api.py │ │ ├── test_ams_labels_api.py │ │ ├── test_archives_api.py │ │ ├── test_auth_api.py │ │ ├── test_available_filaments.py │ │ ├── test_background_dispatch_api.py │ │ ├── test_camera_api.py │ │ ├── test_client_ip.py │ │ ├── test_cloud_auth.py │ │ ├── test_color_map_api.py │ │ ├── test_cost_statistics.py │ │ ├── test_discovery_api.py │ │ ├── test_endpoint_auth.py │ │ ├── test_external_folders_api.py │ │ ├── test_external_links_api.py │ │ ├── test_filaments_api.py │ │ ├── test_github_backup_api.py │ │ ├── test_inventory_assign.py │ │ ├── test_library_api.py │ │ ├── test_maintenance_api.py │ │ ├── test_metrics_api.py │ │ ├── test_mfa_api.py │ │ ├── test_notifications_api.py │ │ ├── test_obico_api.py │ │ ├── test_ownership_permissions.py │ │ ├── test_print_lifecycle.py │ │ ├── test_print_queue_api.py │ │ ├── test_printers_api.py │ │ ├── test_projects_api.py │ │ ├── test_security.py │ │ ├── test_settings_api.py │ │ ├── test_sjf_scheduling.py │ │ ├── test_smart_plugs_api.py │ │ ├── test_spoolbuddy.py │ │ ├── test_spoolman_api.py │ │ ├── test_support_api.py │ │ ├── test_system_api.py │ │ ├── test_updates_api.py │ │ ├── test_user_notifications_api.py │ │ └── test_virtual_printer_api.py │ ├── pytest.ini │ └── unit/ │ ├── __init__.py │ ├── services/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── mock_ftp_server.py │ │ ├── test_archive_copy.py │ │ ├── test_archive_service.py │ │ ├── test_background_dispatch.py │ │ ├── test_bambu_cloud.py │ │ ├── test_bambu_ftp.py │ │ ├── test_bambu_mqtt.py │ │ ├── test_camera_tls_proxy.py │ │ ├── test_email_service.py │ │ ├── test_external_camera.py │ │ ├── test_hms_errors.py │ │ ├── test_layer_timelapse.py │ │ ├── test_ldap_service.py │ │ ├── test_mqtt_smart_plug_subscribe.py │ │ ├── test_notification_service.py │ │ ├── test_plate_detection.py │ │ ├── test_printer_manager.py │ │ ├── test_rest_smart_plug.py │ │ ├── test_smart_plug_manager.py │ │ ├── test_spool_assignment_notifications.py │ │ ├── test_spool_tag_matcher.py │ │ ├── test_spoolbuddy_ssh.py │ │ ├── test_spoolman_service.py │ │ ├── test_spoolman_tracking.py │ │ ├── test_stl_thumbnail.py │ │ ├── test_tasmota.py │ │ ├── test_usage_tracker.py │ │ └── test_virtual_printer.py │ ├── test_archive_file_path_guard.py │ ├── test_archive_filtering.py │ ├── test_bed_jog.py │ ├── test_bug_report.py │ ├── test_bulk_spool_create.py │ ├── test_camera_stderr_summary.py │ ├── test_capture_pid_tracking.py │ ├── test_catalog_bulk_delete.py │ ├── test_cli.py │ ├── test_code_quality.py │ ├── test_color_utils.py │ ├── test_cost_tracking.py │ ├── test_db_dialect.py │ ├── test_energy_snapshots.py │ ├── test_firmware_versions.py │ ├── test_gcode_injection.py │ ├── test_homeassistant_settings.py │ ├── test_ldap_migration.py │ ├── test_local_backup.py │ ├── test_log_error_detection.py │ ├── test_maintenance_rod_filtering.py │ ├── test_mfa_helpers.py │ ├── test_obico_detection.py │ ├── test_obico_smoothing.py │ ├── test_opentag3d.py │ ├── test_orca_profiles.py │ ├── test_permissions.py │ ├── test_permissions_stats_filter.py │ ├── test_phantom_print_hardening.py │ ├── test_plate_object_extraction.py │ ├── test_print_log.py │ ├── test_print_speed.py │ ├── test_print_start_expected_promotion.py │ ├── test_printer_models.py │ ├── test_run_with_retry.py │ ├── test_scheduler_ams_mapping.py │ ├── test_scheduler_auto_drying.py │ ├── test_scheduler_busy_only.py │ ├── test_scheduler_clear_plate.py │ ├── test_scheduler_filament_override.py │ ├── test_scheduler_watchdog.py │ ├── test_slicer_settings.py │ ├── test_slot_preset_key.py │ ├── test_spool_schemas_rgba.py │ ├── test_spoolbuddy_system_stats.py │ ├── test_spoolman_clear_location.py │ ├── test_subtask_archive_resume.py │ ├── test_support_helpers.py │ ├── test_sync_ams_weights.py │ ├── test_threemf_tools.py │ ├── test_usage_tracker.py │ ├── test_user_notifications.py │ ├── test_vp_ftp_port.py │ └── test_vp_mqtt_server.py ├── build_docker.sh ├── deploy/ │ └── bambuddy.service ├── docker-compose.test.yml ├── docker-compose.yml ├── docker-publish-beta.sh ├── docker-publish-daily-beta.sh ├── docker-publish.sh ├── docs/ │ ├── ams_slot_printer_matrix.txt │ ├── bambu_lab_preset_sync_api.md │ └── migration-vp-ftp-port.md ├── frontend/ │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── docs/ │ │ └── create_proxy_diagram.py │ ├── eslint.config.js │ ├── index.html │ ├── mockups/ │ │ └── ams-redesign.html │ ├── package.json │ ├── postcss.config.js │ ├── public/ │ │ ├── manifest.json │ │ ├── sw-register.js │ │ └── sw.js │ ├── scripts/ │ │ └── check-i18n-parity.mjs │ ├── src/ │ │ ├── App.css │ │ ├── App.tsx │ │ ├── __tests__/ │ │ │ ├── api/ │ │ │ │ ├── client.test.ts │ │ │ │ └── githubBackupApi.test.ts │ │ │ ├── components/ │ │ │ │ ├── AMSHistoryModal.test.tsx │ │ │ │ ├── AddPrinterDiscovery.test.tsx │ │ │ │ ├── AssignSpoolModal.test.tsx │ │ │ │ ├── BackupModal.test.tsx │ │ │ │ ├── BugReportBubble.test.tsx │ │ │ │ ├── Button.test.tsx │ │ │ │ ├── Card.test.tsx │ │ │ │ ├── ConfigureAmsSlotModal.test.tsx │ │ │ │ ├── ConfirmModal.test.tsx │ │ │ │ ├── ContextMenu.test.tsx │ │ │ │ ├── Dashboard.test.tsx │ │ │ │ ├── EditArchiveModal.test.tsx │ │ │ │ ├── FailureDetectionSettings.test.tsx │ │ │ │ ├── FilamentHoverCard.test.tsx │ │ │ │ ├── FilamentOverride.test.tsx │ │ │ │ ├── FilamentSlotCircle.test.tsx │ │ │ │ ├── FileManagerModal.test.tsx │ │ │ │ ├── FileUploadModal.test.tsx │ │ │ │ ├── GitHubBackupSettings.scheduled.test.tsx │ │ │ │ ├── HMSErrorModal.test.tsx │ │ │ │ ├── Layout.test.tsx │ │ │ │ ├── LinkSpoolModal.test.tsx │ │ │ │ ├── LocalProfilesView.test.tsx │ │ │ │ ├── ModelViewerModal.test.tsx │ │ │ │ ├── NotificationProviderCard.test.tsx │ │ │ │ ├── PrintModal.test.tsx │ │ │ │ ├── PrintModalDispatchToast.test.tsx │ │ │ │ ├── PrinterQueueWidget.test.tsx │ │ │ │ ├── PrinterSelector.test.ts │ │ │ │ ├── RestoreModal.test.tsx │ │ │ │ ├── SmartPlugCard.test.tsx │ │ │ │ ├── SpoolBuddySettings.test.tsx │ │ │ │ ├── SpoolFormBulk.test.tsx │ │ │ │ ├── SpoolFormModal.test.tsx │ │ │ │ ├── SpoolInfoCard.test.tsx │ │ │ │ ├── SpoolmanSettings.test.tsx │ │ │ │ ├── TagDetectedModal.test.tsx │ │ │ │ ├── TagManagementModal.test.tsx │ │ │ │ ├── Toggle.test.tsx │ │ │ │ ├── UploadModal.test.tsx │ │ │ │ ├── VirtualPrinterCard.test.tsx │ │ │ │ ├── VirtualPrinterSettings.test.tsx │ │ │ │ ├── WeightDisplay.test.tsx │ │ │ │ ├── spool-form/ │ │ │ │ │ └── ColorSectionHexInput.test.tsx │ │ │ │ └── spoolbuddy/ │ │ │ │ ├── AmsUnitCard.test.tsx │ │ │ │ ├── SpoolBuddyBottomNav.test.tsx │ │ │ │ ├── SpoolBuddyLayout.test.tsx │ │ │ │ ├── SpoolBuddyQuickMenu.test.tsx │ │ │ │ ├── SpoolBuddyStatusBar.test.tsx │ │ │ │ ├── SpoolBuddyTopBar.test.tsx │ │ │ │ └── SpoolIcon.test.tsx │ │ │ ├── contexts/ │ │ │ │ ├── AuthContext.test.tsx │ │ │ │ ├── ColorCatalogContext.test.tsx │ │ │ │ └── ToastContext.test.tsx │ │ │ ├── hooks/ │ │ │ │ ├── useCameraStreamToken.test.ts │ │ │ │ ├── useFilamentMapping.test.ts │ │ │ │ ├── useIsMobile.test.ts │ │ │ │ ├── useLongPress.test.ts │ │ │ │ ├── useSpoolBuddyState.test.ts │ │ │ │ └── useWebSocket.test.ts │ │ │ ├── i18n/ │ │ │ │ ├── locales.test.ts │ │ │ │ └── parity-script.test.ts │ │ │ ├── mocks/ │ │ │ │ ├── handlers.ts │ │ │ │ └── server.ts │ │ │ ├── pages/ │ │ │ │ ├── ArchivesPage.test.tsx │ │ │ │ ├── CameraPage.test.tsx │ │ │ │ ├── FileManagerExternalFolder.test.tsx │ │ │ │ ├── FileManagerPage.test.tsx │ │ │ │ ├── GroupEditPage.test.tsx │ │ │ │ ├── InventoryPageGrouping.test.ts │ │ │ │ ├── InventoryPageLowStock.test.tsx │ │ │ │ ├── LoginPage.test.tsx │ │ │ │ ├── MaintenancePage.test.tsx │ │ │ │ ├── NotificationsPage.test.tsx │ │ │ │ ├── PrintersPage.test.tsx │ │ │ │ ├── PrintersPageDrying.test.ts │ │ │ │ ├── PrintersPageFillLevel.test.ts │ │ │ │ ├── PrintersPageFormatPrintName.test.ts │ │ │ │ ├── PrintersPageSpeed.test.tsx │ │ │ │ ├── ProjectDetailPage.test.tsx │ │ │ │ ├── ProjectsPage.test.tsx │ │ │ │ ├── QueuePage.test.tsx │ │ │ │ ├── SettingsPage.test.tsx │ │ │ │ ├── SpoolBuddyAmsPageLogic.test.ts │ │ │ │ ├── SpoolBuddyCalibrationPage.test.tsx │ │ │ │ ├── SpoolBuddyDashboard.test.tsx │ │ │ │ ├── SpoolBuddySettingsPage.test.tsx │ │ │ │ ├── SpoolBuddyWriteTagPage.test.tsx │ │ │ │ ├── StatsPage.test.tsx │ │ │ │ ├── StreamOverlayPage.test.tsx │ │ │ │ └── SystemInfoPage.test.tsx │ │ │ ├── setup.ts │ │ │ ├── utils/ │ │ │ │ ├── colors.test.ts │ │ │ │ ├── currency.test.ts │ │ │ │ ├── date.test.ts │ │ │ │ ├── file.test.ts │ │ │ │ ├── firmwareVersion.test.ts │ │ │ │ ├── getSpoolmanFillLevel.test.ts │ │ │ │ ├── maintenanceWikiUrls.test.ts │ │ │ │ ├── printer.test.ts │ │ │ │ └── slicer.test.ts │ │ │ └── utils.tsx │ │ ├── api/ │ │ │ └── client.ts │ │ ├── components/ │ │ │ ├── AMSHistoryModal.tsx │ │ │ ├── APIBrowser.tsx │ │ │ ├── AddExternalLinkModal.tsx │ │ │ ├── AddNotificationModal.tsx │ │ │ ├── AddSmartPlugModal.tsx │ │ │ ├── AssignSpoolModal.tsx │ │ │ ├── BackupModal.tsx │ │ │ ├── BatchProjectModal.tsx │ │ │ ├── BatchTagModal.tsx │ │ │ ├── BugReportBubble.tsx │ │ │ ├── BulkPrinterToolbar.tsx │ │ │ ├── Button.tsx │ │ │ ├── CalendarView.tsx │ │ │ ├── Card.tsx │ │ │ ├── Collapsible.tsx │ │ │ ├── ColorCatalogSettings.tsx │ │ │ ├── ColumnConfigModal.tsx │ │ │ ├── CompactHistoryRow.tsx │ │ │ ├── CompareArchivesModal.tsx │ │ │ ├── ConfigureAmsSlotModal.tsx │ │ │ ├── ConfirmModal.tsx │ │ │ ├── ContextMenu.tsx │ │ │ ├── CreateUserAdvancedAuthModal.tsx │ │ │ ├── Dashboard.tsx │ │ │ ├── EditArchiveModal.tsx │ │ │ ├── EmailSettings.tsx │ │ │ ├── EmbeddedCameraViewer.tsx │ │ │ ├── ExternalLinksSettings.tsx │ │ │ ├── FailureDetectionSettings.tsx │ │ │ ├── FilamentHoverCard.tsx │ │ │ ├── FilamentSlotCircle.tsx │ │ │ ├── FilamentTrends.tsx │ │ │ ├── FileManagerModal.tsx │ │ │ ├── FileUploadModal.tsx │ │ │ ├── GcodeViewer.tsx │ │ │ ├── GitHubBackupSettings.tsx │ │ │ ├── HMSErrorModal.tsx │ │ │ ├── IconPicker.tsx │ │ │ ├── KProfilesView.tsx │ │ │ ├── KeyboardShortcutsModal.tsx │ │ │ ├── LDAPSettings.tsx │ │ │ ├── Layout.tsx │ │ │ ├── LinkSpoolModal.tsx │ │ │ ├── LocalProfilesView.tsx │ │ │ ├── LogViewer.tsx │ │ │ ├── MQTTDebugModal.tsx │ │ │ ├── MetricToggle.tsx │ │ │ ├── ModelViewer.tsx │ │ │ ├── ModelViewerModal.tsx │ │ │ ├── NotificationLogViewer.tsx │ │ │ ├── NotificationProviderCard.tsx │ │ │ ├── NotificationTemplateEditor.tsx │ │ │ ├── OIDCProviderSettings.tsx │ │ │ ├── PendingUploadsPanel.tsx │ │ │ ├── PhotoGalleryModal.tsx │ │ │ ├── PrintCalendar.tsx │ │ │ ├── PrintModal/ │ │ │ │ ├── FilamentMapping.tsx │ │ │ │ ├── FilamentOverride.tsx │ │ │ │ ├── PlateSelector.tsx │ │ │ │ ├── PrintOptions.tsx │ │ │ │ ├── PrinterSelector.tsx │ │ │ │ ├── ScheduleOptions.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── PrinterInfoModal.tsx │ │ │ ├── PrinterQueueWidget.tsx │ │ │ ├── ProjectPageModal.tsx │ │ │ ├── QRCodeModal.tsx │ │ │ ├── QueueStatsBar.tsx │ │ │ ├── QueueTimelineView.tsx │ │ │ ├── RestoreModal.tsx │ │ │ ├── RichTextEditor.tsx │ │ │ ├── SkipObjectsModal.tsx │ │ │ ├── SmartPlugCard.tsx │ │ │ ├── SpoolBuddySettings.tsx │ │ │ ├── SpoolCatalogSettings.tsx │ │ │ ├── SpoolFormModal.tsx │ │ │ ├── SpoolUsageHistory.tsx │ │ │ ├── SpoolmanSettings.tsx │ │ │ ├── SwitchbarPopover.tsx │ │ │ ├── TagManagementModal.tsx │ │ │ ├── TimelapseEditorModal.tsx │ │ │ ├── TimelapseViewer.tsx │ │ │ ├── Toggle.tsx │ │ │ ├── TwoFactorSettings.tsx │ │ │ ├── UploadModal.tsx │ │ │ ├── VirtualKeyboard.css │ │ │ ├── VirtualKeyboard.tsx │ │ │ ├── VirtualPrinterAddDialog.tsx │ │ │ ├── VirtualPrinterCard.tsx │ │ │ ├── VirtualPrinterList.tsx │ │ │ ├── VirtualPrinterSettings.tsx │ │ │ ├── icons/ │ │ │ │ ├── ChamberLight.tsx │ │ │ │ ├── PlateClearedIcon.tsx │ │ │ │ └── WifiSignal.tsx │ │ │ ├── spool-form/ │ │ │ │ ├── AdditionalSection.tsx │ │ │ │ ├── ColorSection.tsx │ │ │ │ ├── FilamentSection.tsx │ │ │ │ ├── PAProfileSection.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ └── spoolbuddy/ │ │ │ ├── AmsUnitCard.tsx │ │ │ ├── AssignToAmsModal.tsx │ │ │ ├── DiagnosticModal.tsx │ │ │ ├── InventorySpoolInfoCard.tsx │ │ │ ├── LinkSpoolModal.tsx │ │ │ ├── SpoolBuddyBottomNav.tsx │ │ │ ├── SpoolBuddyLayout.tsx │ │ │ ├── SpoolBuddyQuickMenu.tsx │ │ │ ├── SpoolBuddyStatusBar.tsx │ │ │ ├── SpoolBuddyTopBar.tsx │ │ │ ├── SpoolIcon.tsx │ │ │ ├── SpoolInfoCard.tsx │ │ │ ├── TagDetectedModal.tsx │ │ │ └── WeightDisplay.tsx │ │ ├── contexts/ │ │ │ ├── AuthContext.tsx │ │ │ ├── ColorCatalogContext.tsx │ │ │ ├── ThemeContext.tsx │ │ │ └── ToastContext.tsx │ │ ├── hooks/ │ │ │ ├── useCameraStreamToken.ts │ │ │ ├── useColorCatalogVersion.ts │ │ │ ├── useFilamentMapping.ts │ │ │ ├── useIsMobile.ts │ │ │ ├── useIsSidebarCompact.ts │ │ │ ├── useLongPress.ts │ │ │ ├── useMultiPrinterFilamentMapping.ts │ │ │ ├── useSpoolBuddyState.ts │ │ │ └── useWebSocket.ts │ │ ├── i18n/ │ │ │ ├── index.ts │ │ │ └── locales/ │ │ │ ├── de.ts │ │ │ ├── en.ts │ │ │ ├── fr.ts │ │ │ ├── it.ts │ │ │ ├── ja.ts │ │ │ ├── pt-BR.ts │ │ │ ├── zh-CN.ts │ │ │ └── zh-TW.ts │ │ ├── index.css │ │ ├── lib/ │ │ │ └── settingsSearch.ts │ │ ├── main.tsx │ │ ├── pages/ │ │ │ ├── ArchivesPage.tsx │ │ │ ├── CameraPage.tsx │ │ │ ├── ExternalLinkPage.tsx │ │ │ ├── FileManagerPage.tsx │ │ │ ├── GroupEditPage.tsx │ │ │ ├── InventoryPage.tsx │ │ │ ├── LoginPage.tsx │ │ │ ├── MaintenancePage.tsx │ │ │ ├── NotificationsPage.tsx │ │ │ ├── PrintersPage.tsx │ │ │ ├── ProfilesPage.tsx │ │ │ ├── ProjectDetailPage.tsx │ │ │ ├── ProjectsPage.tsx │ │ │ ├── QueuePage.tsx │ │ │ ├── SettingsPage.tsx │ │ │ ├── SetupPage.tsx │ │ │ ├── StatsPage.tsx │ │ │ ├── StreamOverlayPage.tsx │ │ │ ├── SystemInfoPage.tsx │ │ │ ├── UsersPage.tsx │ │ │ └── spoolbuddy/ │ │ │ ├── SpoolBuddyAmsPage.tsx │ │ │ ├── SpoolBuddyCalibrationPage.tsx │ │ │ ├── SpoolBuddyDashboard.tsx │ │ │ ├── SpoolBuddyInventoryPage.tsx │ │ │ ├── SpoolBuddySettingsPage.tsx │ │ │ └── SpoolBuddyWriteTagPage.tsx │ │ ├── types/ │ │ │ └── plates.ts │ │ └── utils/ │ │ ├── amsHelpers.ts │ │ ├── colors.ts │ │ ├── currency.ts │ │ ├── date.ts │ │ ├── file.ts │ │ ├── firmwareVersion.ts │ │ ├── maintenanceWikiUrls.ts │ │ ├── printName.ts │ │ ├── printer.ts │ │ ├── slicer.ts │ │ └── weight.ts │ ├── tailwind.config.js │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── vite.config.ts │ └── vitest.config.ts ├── install/ │ ├── README.md │ ├── docker-install.sh │ ├── install.sh │ ├── update.sh │ └── update_macos.sh ├── pyproject.toml ├── requirements-dev.txt ├── requirements.txt ├── scripts/ │ ├── debug_preset.py │ ├── import_spoolman.py │ ├── mqtt_sniffer.py │ ├── update_archive_date.py │ └── update_archive_quantities.py ├── spoolbuddy/ │ ├── README.md │ ├── daemon/ │ │ ├── __init__.py │ │ ├── api_client.py │ │ ├── config.py │ │ ├── display_control.py │ │ ├── main.py │ │ ├── nau7802.py │ │ ├── nfc_reader.py │ │ ├── pn5180.py │ │ ├── scale_reader.py │ │ ├── system_stats.py │ │ ├── systemd/ │ │ │ └── spoolbuddy.service │ │ └── tag_parser.py │ ├── install/ │ │ ├── generate_splash.py │ │ ├── install.sh │ │ └── spoolbuddy-idle.sh │ ├── scripts/ │ │ ├── pn5180_diag.py │ │ ├── read_tag.py │ │ └── scale_diag.py │ └── tests/ │ ├── __init__.py │ ├── test_api_client.py │ ├── test_config.py │ ├── test_display_control.py │ ├── test_main.py │ └── test_tag_parser.py ├── static/ │ ├── assets/ │ │ ├── index-BoxU3Y8Y.css │ │ └── index-NbcE7Ots.js │ ├── index.html │ ├── manifest.json │ ├── sw-register.js │ └── sw.js ├── test_all.sh ├── test_backend.sh ├── test_docker.sh ├── test_frontend.sh ├── test_security.sh ├── tests/ │ ├── e2e_comprehensive_test.py │ └── e2e_toggle_persistence_test.py └── update_website_wiki.sh