Resource names are unique per owning principal, so different users
can legally create same-name GPU instances, templates, SSH public
keys, storage volumes and storage types — but the admin's
cross-tenant lists and the instance-create template picker rendered
them indistinguishably.
- Group the template picker by owning scope: Your Templates, Global
Templates, then — admin cross-tenant view only — one group per
owner. A single group renders flat without headers. A plugin can
take over grouping via hooks.useTemplateOwnerGroups when its
principal model scopes templates beyond USER owners; a plugin
without the hook keeps the flat list.
- Add an admin-only Creator column to the Instances, SSH Public
Keys, Storage and Storage Types tables, sitting right before
Created (mirroring the API Keys page convention). Resolves
creator_id to a username via the user directory, falling back to
owner_principal_id for legacy rows — a personal-scope row's
creator IS its owner.
- Tag template cards with their owner scope (Global / username) for
admins.
The Creator column and the card tag defer to a plugin that registers
the page's list columns / the OwnerScopeTag slot. Requires the
gpustack server change that records creator_id on templates, SSH
public keys and storage types.
Splice the per-page extra-columns slot ('apiKeys') after the Name
column so plugin-contributed columns (e.g. Organization in the admin
All-org view) render on the API Keys list, matching the other resource
list pages. Declare owner_principal_id (and the already-consumed
masked_value / user_name / user_id) on ListItem.
Compact pill (GitHub icon | star count) placed left of the version
display. Star count is fetched from the GitHub API once per 24h and
cached in localStorage; the button hides entirely when no count is
available (e.g. air-gapped deployments), matching the existing update-
check graceful-degradation pattern. Fetch is bounded by a 4s abort
timeout to avoid hanging requests offline.