Skip to content

[Bug] App Store grid fails to render (TypeError reading 'name') when only a v2-schema 3rd-party store is registered #2537

Open
IceWhaleTech/CasaOS-UI
#274

Description

@decrackill

Describe the bug

The App Store grid fails to render completely (stays blank) when only a third-party app store using the store-config.json schema "version": 2 is registered (such as bigbeartechworld/big-bear-casaos).

The browser DevTools console shows the following frontend crash:

TypeError: Cannot read properties of undefined (reading 'name')
    at fn (AppPanel.vue?:/node_modules/casaos-ui/.../AppPanel.vue:306:38)
    at normalized (vue.esm.js:2315:41)
    at Proxy.renderSlot (vue.esm.js:1993:13)

Root cause:

  1. Backend: The endpoint /v2/app_management/appstore returns an array of registered stores but fails to expose a top-level name field for custom v2 repositories. As shown in the logs below, the backend throws an extension x-casaos not found error inside service.(*App).StoreInfo when attempting to parse the store structure.
  2. Frontend: The Vue engine in AppPanel.vue strictly assumes store.name (or currentCate.name / currentAuthor.name) is always defined. When it receives the payload with undefined fields, it throws an unhandled exception which crashes the entire app grid mount lifecycle.

To Reproduce

  1. Have the default casaos.app store fail or be unregistered.
  2. Register only a third-party store that uses the store-config.json v2 schema (e.g., bigbeartechworld).
  3. Open the App Store panel in the CasaOS web UI.
  4. Observe that the main application grid stays entirely blank/empty.
  5. Open the browser's Developer Tools (F12) and see the TypeError console crash.

Expected behavior

The App Store should parse third-party index schemas gracefully. If the top-level name field is missing from the API response or formatted as a localized object under the version 2 specification, the UI should fallback safely to a default string or the repository URL instead of hard-crashing the render process.

Screenshot

Image

Desktop (please complete the following information):

  • OS: Ubuntu 26.04 LTS (x86_64 Server, headless)
  • Browser: Brave (Chromium-based)
  • Version: CasaOS-UI v0.4.25 / CasaOS-AppManagement v0.4.10-alpha2

System Time

               Local time: Sun 2026-07-12 23:41:57 -05
           Universal time: Mon 2026-07-13 04:41:57 UTC
                 RTC time: Mon 2026-07-13 04:41:57
                Time zone: America/Bogota (-05, -0500)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Logs

Output from sudo journalctl -u casaos-app-management --since "10 min ago" --no-pager:

jul 13 04:40:56 nexus casaos-app-management[51081]: 2026-07-13T04:40:56.453Z    error    extension x-casaos not found        {"func": "service.(*App).StoreInfo", "file": "/home/runner/work/CasaOS-AppManagement/CasaOS-AppManagement/service/app.go", "line": 18}
jul 13 04:40:56 nexus casaos-app-management[51081]: {"time":"2026-07-13T04:40:56.554528468Z","id":"","remote_ip":"192.168.1.15","host":"192.168.1.11","method":"GET","uri":"/v2/app_management/web/appgrid","user_agent":"Mozilla/5.0...","status":200,"latency_human":"185.24ms","bytes_out":751}
jul 13 04:41:56 nexus casaos-app-management[51081]: 2026-07-13T04:41:56.456Z    error    extension x-casaos not found        {"func": "service.(*App).StoreInfo", "file": "/home/runner/work/CasaOS-AppManagement/CasaOS-AppManagement/service/app.go", "line": 18}
jul 13 04:45:30 nexus casaos-app-management[51081]: 2026-07-13T04:45:30.920Z    info     appstore size not changed           {"url": "[https://github.com/bigbeartechworld/big-bear-casaos/archive/refs/heads/master.zip](https://github.com/bigbeartechworld/big-bear-casaos/archive/refs/heads/master.zip)", "func": "service.(*appStore).UpdateCatalog", "line": 91}

(Note: Other modules such as casaos-gateway, casaos-user-service and casaos.service were checked and showed normal operations / HTTP 200 OK Pings without backend exceptions).

Additional context

This behavior was uncovered after clean-installing via get.casaos.io. The automated setup downloaded mismatched versions independently (UI v0.4.25 combined with an alpha app-management binary).

Simultaneously, the default casaos.app repository endpoint suffered a temporary TLS certificate validation issue on the server side (mismatched common name pointing to wildcard github domain properties), forcing its removal. Once the primary store was deleted and only the v2-schema custom store remained, the frontend logic hit this uncaught reference error.

Workaround applied: Manually patched the compiled UI JavaScript bundle to validate the presence of the properties before calling .name, which successfully restored the grid functionality. Not using a ZimaBoard device.

P.S. Finding this bug past midnight was wild JAJAJ. Honestly, studying anthropology makes you appreciate this: watching the frontend have a literal identity crisis and hard-crash just because it couldn't find a 'name' field was a fascinating phenomenon to witness. Vue.js took the missing text way too personally and chose absolute silence. Highly dramatic. Both the server and I definitely need a sudo poweroff at this point. I hope this helps! :D

Activity

  1. decrackill commented on Jul 13, 2026

    @decrackill
    Author

    One more thing, this is what the store looked like before the bug was fixed (I think many people have experienced this):

    Image

    And so, after solving it:

    Image
  2. inkly commented on Sep 4, 2026

    @inkly

    Fixed in the inkly distribution of CasaOS, v0.4.41.

    getCategoryList() dropped every category with a count of 0 and then took the first of what was left as the current selection. With only a third-party store registered the backend answers a single "All" entry with count 0, the filter empties the menu, and currentCate becomes undefined — the dropdown trigger reads currentCate.name, so the render error took the whole panel down, and the list request threw on the same read.

    Guarded at the single place that writes the selection rather than at each reader: when nothing survives the filter, the selection falls back to a plain "All", which is the branch that lists the whole catalogue anyway.

    curl -fsSL https://github.com/inkly/CasaOS-Install/releases/latest/download/install.sh | sudo bash
    

    Release notes: https://github.com/inkly/CasaOS-Install/releases/tag/v0.4.41

  3. added a commit that references this issue on Sep 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions