···3030 Err error
3131}
32323333-// CheckUpgrades checks every AppImage in ~/AppImages for an available update.
3434-// Results come back in sorted filename order. Apps with no update info or
3535-// already current are included with NoSource/Available=false so the caller
3636-// can decide what to show.
3333+// CheckUpgrades checks appherder-managed AppImages for available updates.
3434+// Only apps whose desktop file carries the X-AppHerder=true marker are
3535+// included. Results come back in sorted filename order. Apps with no update
3636+// info or already current are included with NoSource/Available=false so the
3737+// caller can decide what to show.
3738func (a App) CheckUpgrades(ctx context.Context) ([]UpgradeCheck, error) {
3839 files, err := listAppImages(a.appimagesDir)
3940 if err != nil {
4041 return nil, err
4142 }
4242- return parallelMap(ctx, files, checkConcurrency, func(ctx context.Context, file string) UpgradeCheck {
4343+4444+ var managed []string
4545+ for _, file := range files {
4646+ name := strings.TrimSuffix(filepath.Base(file), filepath.Ext(file))
4747+ desktop := filepath.Join(a.applicationsDir, name+".desktop")
4848+ if owned, _ := isManagedDesktop(desktop); owned {
4949+ managed = append(managed, file)
5050+ }
5151+ }
5252+5353+ return parallelMap(ctx, managed, checkConcurrency, func(ctx context.Context, file string) UpgradeCheck {
4354 return checkOne(ctx, file)
4455 }), nil
4556}