GopeedLab/gopeed · error

extension title is required

Error message

extension title is required

What it means

Extension.validate() requires a non-empty title in manifest.json. The title is the human-readable display name shown in the extensions UI, so an empty one fails install even when name and version are present. It is checked second, after name.

Solutions

  1. Add a non-empty "title" to manifest.json
  2. Double-check exact key spelling and top-level placement
  3. Reinstall the extension after fixing the manifest

Example fix

// before (manifest.json)
{ "name": "my-extension", "version": "1.0.0" }
// after
{ "name": "my-extension", "title": "My Extension", "version": "1.0.0" }
Defensive patterns

Strategy: validation

Validate before calling

// Go: pre-validate manifest title
var m map[string]any
_ = json.Unmarshal(raw, &m)
if s, _ := m["title"].(string); strings.TrimSpace(s) == "" {
    return fmt.Errorf("manifest.json: 'title' is required")
}

Prevention

When it happens

Trigger: manifest.json with a "name" but missing or empty "title"; title key misspelled ("label", "Title") so the field stays zero after unmarshal.

Common situations: Minimal manifests written quickly for testing; converting another format's manifest and dropping the display-name field; templates where title defaults to a placeholder that was cleared.

Related errors


AI-assisted analysis of GopeedLab/gopeed@7b7327ffb3 (2026-08-16). Data as JSON: /api/errors/7ff4775970dbae59. Report an issue: GitHub.

Appendix: source

Thrown at pkg/download/extension.go:441

	Scripts    []*Script   `json:"scripts"`
	Settings   []*Setting  `json:"settings"`
	// Disabled if true, this extension will be ignored
	Disabled bool `json:"disabled"`

	DevMode bool `json:"devMode"`
	// DevPath is the local path of extension source code
	DevPath string `json:"devPath"`

	CreatedAt time.Time `json:"createdAt"`
	UpdatedAt time.Time `json:"updatedAt"`
}

func (e *Extension) validate() error {
	if e.Name == "" {
		return fmt.Errorf("extension name is required")
	}
	if e.Title == "" {
		return fmt.Errorf("extension title is required")
	}
	if e.Version == "" {
		return fmt.Errorf("extension version is required")
	}
	return nil
}

func (e *Extension) buildIdentity() string {
	if e.Author == "" {
		return e.Name
	}
	return e.Author + "@" + e.Name
}

func (e *Extension) buildInstallUrl() string {
	if e.Repository == nil || e.Repository.Url == "" {
		return ""
	}

View on GitHub (pinned to 7b7327ffb3)