Skip to content

Feat/448 equipment rack#519

Merged
9thLevelSoftware merged 5 commits into
mainfrom
feat/448-equipment-rack
Jun 7, 2026
Merged

Feat/448 equipment rack#519
9thLevelSoftware merged 5 commits into
mainfrom
feat/448-equipment-rack

Conversation

@9thLevelSoftware

Copy link
Copy Markdown
Owner

No description provided.

Copilot AI review requested due to automatic review settings June 7, 2026 23:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the 'Equipment Rack' feature, allowing users to manage local accessories and added loads or counterweights for workout sessions. It adds database migrations to persist rack context, a settings-backed repository, load calculation use cases, UI components for rack selection, and updates to the backup and sync systems. The review feedback highlights localization gaps where German, Spanish, French, and Dutch resource files contain English strings, providing the correct translations. Additionally, it identifies an atomicity issue in the backup import process, recommending that settings-backed equipment rack items be imported only after the database transaction successfully completes.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +622 to +652
<string name="equipment_rack_title">Equipment Rack</string>
<string name="equipment_rack_description">Manage local accessories and added load for workout sessions.</string>
<string name="equipment_rack_empty">No rack items yet.</string>
<string name="equipment_rack_add_item">Add rack item</string>
<string name="equipment_rack_edit_item">Edit rack item</string>
<string name="equipment_rack_name_label">Item name</string>
<string name="equipment_rack_weight_label">Weight (%1$s)</string>
<string name="equipment_rack_category_label">Category</string>
<string name="equipment_rack_behavior_label">Load behavior</string>
<string name="equipment_rack_enabled">Enabled</string>
<string name="equipment_rack_invalid_name">Name is required.</string>
<string name="equipment_rack_invalid_weight">Enter a non-negative finite weight.</string>
<string name="equipment_rack_active_selection">Equipment rack</string>
<string name="equipment_rack_manage">Manage</string>
<string name="equipment_rack_no_enabled_items">No enabled rack items.</string>
<string name="equipment_rack_none_selected">No rack items selected.</string>
<string name="equipment_rack_selected_summary">Selected: %1$s</string>
<string name="equipment_rack_display_only_count">%1$d display-only</string>
<string name="equipment_rack_selected_count">%1$d selected</string>
<string name="equipment_rack_inline_context">Rack: %1$s</string>
<string name="equipment_rack_category_weighted_vest">Weighted vest</string>
<string name="equipment_rack_category_dip_belt">Dip belt</string>
<string name="equipment_rack_category_chains">Chains</string>
<string name="equipment_rack_category_band">Band</string>
<string name="equipment_rack_category_assistance">Assistance</string>
<string name="equipment_rack_category_attachment">Attachment</string>
<string name="equipment_rack_category_other">Other</string>
<string name="equipment_rack_behavior_added">Added resistance</string>
<string name="equipment_rack_behavior_counterweight">Counterweight</string>
<string name="equipment_rack_behavior_display_only">Display only</string>
<string name="cd_equipment_rack">Equipment rack</string>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The newly added strings for the Equipment Rack feature are in English instead of German. Please use the German translations to ensure proper localization.

    <string name="equipment_rack_title">Equipment-Rack</string>
    <string name="equipment_rack_description">Verwalte lokales Zubehör und zusätzliche Lasten für Trainingseinheiten.</string>
    <string name="equipment_rack_empty">Noch keine Rack-Elemente vorhanden.</string>
    <string name="equipment_rack_add_item">Rack-Element hinzufügen</string>
    <string name="equipment_rack_edit_item">Rack-Element bearbeiten</string>
    <string name="equipment_rack_name_label">Name des Elements</string>
    <string name="equipment_rack_weight_label">Gewicht (%1$s)</string>
    <string name="equipment_rack_category_label">Kategorie</string>
    <string name="equipment_rack_behavior_label">Lastverhalten</string>
    <string name="equipment_rack_enabled">Aktiviert</string>
    <string name="equipment_rack_invalid_name">Name ist erforderlich.</string>
    <string name="equipment_rack_invalid_weight">Geben Sie ein nicht-negatives, endliches Gewicht ein.</string>
    <string name="equipment_rack_active_selection">Equipment-Rack</string>
    <string name="equipment_rack_manage">Verwalten</string>
    <string name="equipment_rack_no_enabled_items">Keine aktivierten Rack-Elemente.</string>
    <string name="equipment_rack_none_selected">Keine Rack-Elemente ausgewählt.</string>
    <string name="equipment_rack_selected_summary">Ausgewählt: %1$s</string>
    <string name="equipment_rack_display_only_count">%1$d nur Anzeige</string>
    <string name="equipment_rack_selected_count">%1$d ausgewählt</string>
    <string name="equipment_rack_inline_context">Rack: %1$s</string>
    <string name="equipment_rack_category_weighted_vest">Gewichtsweste</string>
    <string name="equipment_rack_category_dip_belt">Dip-Gürtel</string>
    <string name="equipment_rack_category_chains">Ketten</string>
    <string name="equipment_rack_category_band">Band</string>
    <string name="equipment_rack_category_assistance">Unterstützung</string>
    <string name="equipment_rack_category_attachment">Aufsatz</string>
    <string name="equipment_rack_category_other">Andere</string>
    <string name="equipment_rack_behavior_added">Zusätzlicher Widerstand</string>
    <string name="equipment_rack_behavior_counterweight">Gegengewicht</string>
    <string name="equipment_rack_behavior_display_only">Nur Anzeige</string>
    <string name="cd_equipment_rack">Equipment-Rack</string>

Comment on lines +622 to +652
<string name="equipment_rack_title">Equipment Rack</string>
<string name="equipment_rack_description">Manage local accessories and added load for workout sessions.</string>
<string name="equipment_rack_empty">No rack items yet.</string>
<string name="equipment_rack_add_item">Add rack item</string>
<string name="equipment_rack_edit_item">Edit rack item</string>
<string name="equipment_rack_name_label">Item name</string>
<string name="equipment_rack_weight_label">Weight (%1$s)</string>
<string name="equipment_rack_category_label">Category</string>
<string name="equipment_rack_behavior_label">Load behavior</string>
<string name="equipment_rack_enabled">Enabled</string>
<string name="equipment_rack_invalid_name">Name is required.</string>
<string name="equipment_rack_invalid_weight">Enter a non-negative finite weight.</string>
<string name="equipment_rack_active_selection">Equipment rack</string>
<string name="equipment_rack_manage">Manage</string>
<string name="equipment_rack_no_enabled_items">No enabled rack items.</string>
<string name="equipment_rack_none_selected">No rack items selected.</string>
<string name="equipment_rack_selected_summary">Selected: %1$s</string>
<string name="equipment_rack_display_only_count">%1$d display-only</string>
<string name="equipment_rack_selected_count">%1$d selected</string>
<string name="equipment_rack_inline_context">Rack: %1$s</string>
<string name="equipment_rack_category_weighted_vest">Weighted vest</string>
<string name="equipment_rack_category_dip_belt">Dip belt</string>
<string name="equipment_rack_category_chains">Chains</string>
<string name="equipment_rack_category_band">Band</string>
<string name="equipment_rack_category_assistance">Assistance</string>
<string name="equipment_rack_category_attachment">Attachment</string>
<string name="equipment_rack_category_other">Other</string>
<string name="equipment_rack_behavior_added">Added resistance</string>
<string name="equipment_rack_behavior_counterweight">Counterweight</string>
<string name="equipment_rack_behavior_display_only">Display only</string>
<string name="cd_equipment_rack">Equipment rack</string>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The newly added strings for the Equipment Rack feature are in English instead of Spanish. Please use the Spanish translations to ensure proper localization.

    <string name="equipment_rack_title">Rack de equipamiento</string>
    <string name="equipment_rack_description">Gestiona accesorios locales y carga añadida para las sesiones de entrenamiento.</string>
    <string name="equipment_rack_empty">Aún no hay elementos en el rack.</string>
    <string name="equipment_rack_add_item">Añadir elemento al rack</string>
    <string name="equipment_rack_edit_item">Editar elemento del rack</string>
    <string name="equipment_rack_name_label">Nombre del elemento</string>
    <string name="equipment_rack_weight_label">Peso (%1$s)</string>
    <string name="equipment_rack_category_label">Categoría</string>
    <string name="equipment_rack_behavior_label">Comportamiento de carga</string>
    <string name="equipment_rack_enabled">Habilitado</string>
    <string name="equipment_rack_invalid_name">El nombre es obligatorio.</string>
    <string name="equipment_rack_invalid_weight">Introduce un peso finito no negativo.</string>
    <string name="equipment_rack_active_selection">Rack de equipamiento</string>
    <string name="equipment_rack_manage">Gestionar</string>
    <string name="equipment_rack_no_enabled_items">No hay elementos habilitados en el rack.</string>
    <string name="equipment_rack_none_selected">Ningún elemento seleccionado.</string>
    <string name="equipment_rack_selected_summary">Seleccionado: %1$s</string>
    <string name="equipment_rack_display_only_count">%1$d solo visualización</string>
    <string name="equipment_rack_selected_count">%1$d seleccionado</string>
    <string name="equipment_rack_inline_context">Rack: %1$s</string>
    <string name="equipment_rack_category_weighted_vest">Chaleco lastrado</string>
    <string name="equipment_rack_category_dip_belt">Cinturón de dominadas</string>
    <string name="equipment_rack_category_chains">Cadenas</string>
    <string name="equipment_rack_category_band">Banda</string>
    <string name="equipment_rack_category_assistance">Asistencia</string>
    <string name="equipment_rack_category_attachment">Accesorio</string>
    <string name="equipment_rack_category_other">Otro</string>
    <string name="equipment_rack_behavior_added">Resistencia añadida</string>
    <string name="equipment_rack_behavior_counterweight">Contrapeso</string>
    <string name="equipment_rack_behavior_display_only">Solo visualización</string>
    <string name="cd_equipment_rack">Rack de equipamiento</string>

Comment on lines +622 to +652
<string name="equipment_rack_title">Equipment Rack</string>
<string name="equipment_rack_description">Manage local accessories and added load for workout sessions.</string>
<string name="equipment_rack_empty">No rack items yet.</string>
<string name="equipment_rack_add_item">Add rack item</string>
<string name="equipment_rack_edit_item">Edit rack item</string>
<string name="equipment_rack_name_label">Item name</string>
<string name="equipment_rack_weight_label">Weight (%1$s)</string>
<string name="equipment_rack_category_label">Category</string>
<string name="equipment_rack_behavior_label">Load behavior</string>
<string name="equipment_rack_enabled">Enabled</string>
<string name="equipment_rack_invalid_name">Name is required.</string>
<string name="equipment_rack_invalid_weight">Enter a non-negative finite weight.</string>
<string name="equipment_rack_active_selection">Equipment rack</string>
<string name="equipment_rack_manage">Manage</string>
<string name="equipment_rack_no_enabled_items">No enabled rack items.</string>
<string name="equipment_rack_none_selected">No rack items selected.</string>
<string name="equipment_rack_selected_summary">Selected: %1$s</string>
<string name="equipment_rack_display_only_count">%1$d display-only</string>
<string name="equipment_rack_selected_count">%1$d selected</string>
<string name="equipment_rack_inline_context">Rack: %1$s</string>
<string name="equipment_rack_category_weighted_vest">Weighted vest</string>
<string name="equipment_rack_category_dip_belt">Dip belt</string>
<string name="equipment_rack_category_chains">Chains</string>
<string name="equipment_rack_category_band">Band</string>
<string name="equipment_rack_category_assistance">Assistance</string>
<string name="equipment_rack_category_attachment">Attachment</string>
<string name="equipment_rack_category_other">Other</string>
<string name="equipment_rack_behavior_added">Added resistance</string>
<string name="equipment_rack_behavior_counterweight">Counterweight</string>
<string name="equipment_rack_behavior_display_only">Display only</string>
<string name="cd_equipment_rack">Equipment rack</string>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The newly added strings for the Equipment Rack feature are in English instead of French. Please use the French translations to ensure proper localization.

    <string name="equipment_rack_title">Rack d\'équipement</string>
    <string name="equipment_rack_description">Gérez les accessoires locaux et la charge ajoutée pour les séances d\'entraînement.</string>
    <string name="equipment_rack_empty">Aucun élément dans le rack pour le moment.</string>
    <string name="equipment_rack_add_item">Ajouter un élément au rack</string>
    <string name="equipment_rack_edit_item">Modifier l\'élément du rack</string>
    <string name="equipment_rack_name_label">Nom de l\'élément</string>
    <string name="equipment_rack_weight_label">Poids (%1$s)</string>
    <string name="equipment_rack_category_label">Catégorie</string>
    <string name="equipment_rack_behavior_label">Comportement de la charge</string>
    <string name="equipment_rack_enabled">Activé</string>
    <string name="equipment_rack_invalid_name">Le nom est requis.</string>
    <string name="equipment_rack_invalid_weight">Saisissez un poids fini non négatif.</string>
    <string name="equipment_rack_active_selection">Rack d\'équipement</string>
    <string name="equipment_rack_manage">Gérer</string>
    <string name="equipment_rack_no_enabled_items">Aucun élément activé dans le rack.</string>
    <string name="equipment_rack_none_selected">Aucun élément sélectionné.</string>
    <string name="equipment_rack_selected_summary">Sélectionné : %1$s</string>
    <string name="equipment_rack_display_only_count">%1$d affichage uniquement</string>
    <string name="equipment_rack_selected_count">%1$d sélectionné</string>
    <string name="equipment_rack_inline_context">Rack : %1$s</string>
    <string name="equipment_rack_category_weighted_vest">Gilet lesté</string>
    <string name="equipment_rack_category_dip_belt">Ceinture de lest</string>
    <string name="equipment_rack_category_chains">Chaînes</string>
    <string name="equipment_rack_category_band">Bande</string>
    <string name="equipment_rack_category_assistance">Assistance</string>
    <string name="equipment_rack_category_attachment">Fixation</string>
    <string name="equipment_rack_category_other">Autre</string>
    <string name="equipment_rack_behavior_added">Résistance ajoutée</string>
    <string name="equipment_rack_behavior_counterweight">Contrepoids</string>
    <string name="equipment_rack_behavior_display_only">Affichage uniquement</string>
    <string name="cd_equipment_rack">Rack d\'équipement</string>

Comment on lines +601 to +631
<string name="equipment_rack_title">Equipment Rack</string>
<string name="equipment_rack_description">Manage local accessories and added load for workout sessions.</string>
<string name="equipment_rack_empty">No rack items yet.</string>
<string name="equipment_rack_add_item">Add rack item</string>
<string name="equipment_rack_edit_item">Edit rack item</string>
<string name="equipment_rack_name_label">Item name</string>
<string name="equipment_rack_weight_label">Weight (%1$s)</string>
<string name="equipment_rack_category_label">Category</string>
<string name="equipment_rack_behavior_label">Load behavior</string>
<string name="equipment_rack_enabled">Enabled</string>
<string name="equipment_rack_invalid_name">Name is required.</string>
<string name="equipment_rack_invalid_weight">Enter a non-negative finite weight.</string>
<string name="equipment_rack_active_selection">Equipment rack</string>
<string name="equipment_rack_manage">Manage</string>
<string name="equipment_rack_no_enabled_items">No enabled rack items.</string>
<string name="equipment_rack_none_selected">No rack items selected.</string>
<string name="equipment_rack_selected_summary">Selected: %1$s</string>
<string name="equipment_rack_display_only_count">%1$d display-only</string>
<string name="equipment_rack_selected_count">%1$d selected</string>
<string name="equipment_rack_inline_context">Rack: %1$s</string>
<string name="equipment_rack_category_weighted_vest">Weighted vest</string>
<string name="equipment_rack_category_dip_belt">Dip belt</string>
<string name="equipment_rack_category_chains">Chains</string>
<string name="equipment_rack_category_band">Band</string>
<string name="equipment_rack_category_assistance">Assistance</string>
<string name="equipment_rack_category_attachment">Attachment</string>
<string name="equipment_rack_category_other">Other</string>
<string name="equipment_rack_behavior_added">Added resistance</string>
<string name="equipment_rack_behavior_counterweight">Counterweight</string>
<string name="equipment_rack_behavior_display_only">Display only</string>
<string name="cd_equipment_rack">Equipment rack</string>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The newly added strings for the Equipment Rack feature are in English instead of Dutch. Please use the Dutch translations to ensure proper localization.

    <string name="equipment_rack_title">Equipment rack</string>
    <string name="equipment_rack_description">Beheer lokale accessoires en toegevoegde belasting voor trainingssessies.</string>
    <string name="equipment_rack_empty">Nog geen rack-items.</string>
    <string name="equipment_rack_add_item">Rack-item toevoegen</string>
    <string name="equipment_rack_edit_item">Rack-item bewerken</string>
    <string name="equipment_rack_name_label">Naam item</string>
    <string name="equipment_rack_weight_label">Gewicht (%1$s)</string>
    <string name="equipment_rack_category_label">Categorie</string>
    <string name="equipment_rack_behavior_label">Belastingsgedrag</string>
    <string name="equipment_rack_enabled">Ingeschakeld</string>
    <string name="equipment_rack_invalid_name">Naam is verplicht.</string>
    <string name="equipment_rack_invalid_weight">Voer een niet-negatief eindig gewicht in.</string>
    <string name="equipment_rack_active_selection">Equipment rack</string>
    <string name="equipment_rack_manage">Beheren</string>
    <string name="equipment_rack_no_enabled_items">Geen ingeschakelde rack-items.</string>
    <string name="equipment_rack_none_selected">Geen rack-items geselecteerd.</string>
    <string name="equipment_rack_selected_summary">Geselecteerd: %1$s</string>
    <string name="equipment_rack_display_only_count">%1$d alleen weergave</string>
    <string name="equipment_rack_selected_count">%1$d geselecteerd</string>
    <string name="equipment_rack_inline_context">Rack: %1$s</string>
    <string name="equipment_rack_category_weighted_vest">Gewichtsvest</string>
    <string name="equipment_rack_category_dip_belt">Dipriem</string>
    <string name="equipment_rack_category_chains">Kettingen</string>
    <string name="equipment_rack_category_band">Band</string>
    <string name="equipment_rack_category_assistance">Assistentie</string>
    <string name="equipment_rack_category_attachment">Hulpstuk</string>
    <string name="equipment_rack_category_other">Overig</string>
    <string name="equipment_rack_behavior_added">Toegevoegde weerstand</string>
    <string name="equipment_rack_behavior_counterweight">Contragewicht</string>
    <string name="equipment_rack_behavior_display_only">Alleen weergave</string>
    <string name="cd_equipment_rack">Equipment rack</string>

Comment thread shared/src/commonMain/kotlin/com/devil/phoenixproject/util/DataBackupManager.kt Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 728dda259b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

*/
private fun loadRoutineInternal(routine: Routine) {
val normalized = normalizeExerciseOrder(routine)
coordinator.clearActiveRackSelection()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Initialize first exercise rack defaults when loading cycles

When a training-cycle workout is started, HomeScreen.startCycleWorkout calls loadRoutineFromCycle(...) and then immediately startWorkout() without going through enterSetReady, while loadRoutineInternal now clears the rack selection but never applies firstExercise.defaultRackItemIds. In that direct-start path the first set captures an empty rack snapshot, so any saved equipment defaults on the first exercise are ignored until a later transition calls enterSetReady.

Useful? React with 👍 / 👎.

claude added 2 commits June 7, 2026 23:27
Preserves all equipment rack changes (migration 33/34, EquipmentRackRepository,
ApplyEquipmentRackLoadUseCase, UI screens) alongside main's additions:
RecommendWeightAdjustmentUseCase wired throughout DWSM/ActiveSessionEngine/
MainViewModel/DI modules, BiomechanicsSetSummary import, clearActiveRackSelection
activeRackItemIds field, and weightAdjustmentRecommendation cleared on exit.

https://claude.ai/code/session_01WxRj59MExhKYTTJHtC8jxJ
- Translate equipment rack strings to German, Spanish, French, and Dutch
- Fix DataBackupManager: move importEquipmentRackItems after the DB transaction
  so settings-backed rack items are only written when the DB import succeeds,
  preserving atomicity on failure
- Fix RoutineFlowManager: seed first exercise rack defaults in loadRoutineInternal
  so direct-start paths (training cycle workouts bypassing enterSetReady) capture
  the correct rack snapshot from set 1

https://claude.ai/code/session_01WxRj59MExhKYTTJHtC8jxJ
rackItems += item
}
nav.endArray()
importEquipmentRackItems(rackItems)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: You import equipment rack items during JSON streaming — before the DB transaction — but importFromJson (line 860) correctly defers this until after the transaction. The comment at line 858-859 says "a DB failure must not leave rack items modified," yet the streaming path does exactly that. This is the code equivalent of saying "trust me bro" while defusing a bomb.

🩹 The Fix: Buffer the rack items during streaming and apply them only after the database transaction succeeds, matching the atomicity guarantee in the non-streaming path. Use a container to defer the import.

📏 Severity: warning

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: caac417297

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 184 to +188
val isEchoMode = showCableOnlyExerciseControls && selectedMode is WorkoutMode.Echo

LaunchedEffect(rackItems, defaultRackItemIds) {
val enabledRackIds = rackItems.filter { it.enabled }.map { it.id }.toSet()
val filtered = defaultRackItemIds.filter { it in enabledRackIds }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve disabled rack defaults while editing

When a routine exercise already has a saved rack default and that rack item is currently disabled, opening this sheet immediately filters the ID out of defaultRackItemIds; saving any unrelated edit then overwrites the routine/single-exercise defaults without that item. Disabled rack items are already ignored at workout time by EquipmentRackRepository.resolveActiveItems, so this effect turns a temporary disabled state into permanent data loss if the user later re-enables the item.

Useful? React with 👍 / 👎.

@9thLevelSoftware 9thLevelSoftware merged commit e3e5ecc into main Jun 7, 2026
10 checks passed
@9thLevelSoftware 9thLevelSoftware deleted the feat/448-equipment-rack branch June 7, 2026 23:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants