AprilNEA / AprilNEA/OpenLogi

[Bug]: Lift always renders the generic silhouette — resolver ignores the manifest's image_metadata and only accepts hardcoded metadata names

Closed
#782 1 comment 1 reaction 0 assignees View on GitHub
type: bug
Dominant language
Rust
Stars
21k
Forks
675
Avg merge
2d 5h
Merged PRs (30d)
172

Description

### Which part of OpenLogi?

GUI (desktop app)

### OpenLogi version

0.7.4

### Operating system

macOS

### OS version & architecture

macOS 26.5.1, Apple Silicon

### Device model

Lift for Mac (pid `b031`, ext `04`), no receiver

### How is the device connected?

Bluetooth (direct, no receiver)

### Affected area(s)

Other (device image / asset rendering)

### What happened?

The GUI detects my Lift and matches it to the `mx_vertical_mini` depot. But it always renders the generic silhouette, never the device image. This happens with a complete, checksum-verified asset bundle on disk.

The cause is in the asset resolver. `load_files` in `crates/openlogi-desktop/src/services/assets.rs` skips a depot when none of the hardcoded metadata names exist:

```rust
// crates/openlogi-assets/src/index.rs:84
pub const METADATA_FILES: [&str; 3] = ["core_metadata.json", "metadata_full.json", "metadata.json"];
```

The Lift bundle contains none of these files. Because the Lift has left-hand and right-hand versions, its metadata is split into `core_metadata_left.json` and `core_metadata_right.json`. The bundle manifest points to the correct file for each variant:

```json
{ "key": "image_metadata", "src": "core_metadata_right.json" }
```

The resolver reads this same manifest to select the variant image. It does not read it to select the metadata file. So the metadata check fails for every root, `resolve` returns `None`, and the GUI falls back to the silhouette:

```
DEBUG openlogi_desktop::services::assets: asset matched via bolt-pid suffix fallback depot="mx_vertical_mini"
DEBUG openlogi_desktop::services::assets: asset cache miss across all roots depot="mx_vertical_mini"
```

This affects every Lift and Lift for Business install. The `mx_vertical_mini` and `mx_vertical_mini_for_business` depots only ship the `_left`/`_right` metadata files.

### Steps to reproduce

1. Connect a Lift (any variant) and let the GUI download its asset bundle.
2. Make sure that `~/.local/share/openlogi/assets/mx_vertical_mini/` contains the bundle files.
3. Open the GUI.
4. The device card shows the generic silhouette, not the device render.
5. Copy `core_metadata_right.json` to `core_metadata.json` in that folder and restart the GUI.
6. The device render now appears (`asset hit ... image=front_ext_2.png ext=4`).

### Logs

Before the workaround:

```
DEBUG openlogi_desktop::services::assets: asset matched via bolt-pid suffix fallback depot="mx_vertical_mini"
DEBUG openlogi_desktop::services::assets: asset cache miss across all roots depot="mx_vertical_mini"
INFO openlogi_desktop::app: no devices with HID++ model info — using synthetic silhouette
```

After the workaround (step 5 above):

```
DEBUG openlogi_desktop::services::assets: asset hit depot="mx_vertical_mini" root=/Users/[redacted]/.local/share/openlogi/assets image=front_ext_2.png ext=4 png_width=860 png_height=1256
```

### Possible fix

In `load_files`, resolve the metadata name through the manifest first. Use the `image_metadata` resource of the matched variant, with the same model-id candidates as the image lookup. Keep the `METADATA_FILES` list as a fallback for old bundles without a manifest. The sync side must then also download the manifest-referenced metadata file, not only the hardcoded names.

### macOS permissions

Not related — asset rendering only.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in crates/openlogi-desktop/src/services/assets.rs at load_files, then read crates/openlogi-assets/src/index.rs and the manifest-based image lookup. Trace the sync path that downloads bundle files. Done means manifest-referenced image_metadata files are resolved and downloaded, while old bundles still use the hardcoded fallback, and Lift assets render instead of the silhouette.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
desktop
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.