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
- Add a non-empty "title" to manifest.json
- Double-check exact key spelling and top-level placement
- 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
- Fill title (display name) in addition to name (slug) in the template
- Check exact key spelling — 'title', top-level
- Re-validate after renaming keys when porting manifests from other formats
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
- extension name is required
- extension version is required
- manifest.json not found
- execute expects a string or function
- invalid resource file name
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)