gohugoio/hugo · error
no sites to build
Error message
no sites to build
What it means
Emitted during site construction (hugolib/site.go:412) when, after iterating the configured languages/configs, the resulting sites slice is empty. Hugo cannot build anything without at least one site, so it fails fast instead of producing empty output.
Source
Thrown at hugolib/site.go:412
pub, err := publisher.NewDestinationPublisher(
firstSiteDeps.ResourceSpec,
s.conf.OutputFormats.Config,
s.conf.MediaTypes.Config,
)
if err != nil {
return nil, err
}
s.publisher = pub
s.relatedDocsHandler = page.NewRelatedDocsHandler(s.conf.Related)
// Site deps end.
sites = append(sites, s)
}
if len(sites) == 0 {
return nil, errors.New("no sites to build")
}
sitesVersionsRoles := make([][][]*Site, len(sites))
for i := 0; i < len(sites); i++ {
sitesVersionsRoles[i] = make([][]*Site, len(versionsSorted))
for j := range versionsSorted {
sitesVersionsRoles[i][j] = make([]*Site, len(rolesSorted))
}
}
siteVersionRoles := map[types.Ints2][]roles.Role{}
siteRoleVersions := map[types.Ints2][]versions.Version{}
// i = site, j = version, k = role
for i, v1 := range sitesVersionsRoles {
for j, v2 := range v1 {
for k := range v2 {
var vrs *Site
if j == 0 && k == 0 {View on GitHub ↗ (pinned to 8a468df065)
Solutions
- Check disableLanguages in your config — ensure at least one defined language is not disabled.
- Verify the [languages] section defines at least one language and keys aren't misspelled.
- Run `hugo config` to inspect the merged configuration (environment overlays may disable languages unexpectedly).
Example fix
# before (hugo.toml) [languages.en] [languages.fr] disableLanguages = ["en", "fr"] # after disableLanguages = ["fr"]
Defensive patterns
Strategy: validation
Validate before calling
cfg, err := allconfig.LoadConfig(...)
if err != nil { return err }
if len(cfg.LanguagesDefaultFirst) == 0 {
return fmt.Errorf("config defines no languages/sites")
} Prevention
- Ensure the site config defines at least one language and doesn't disable all of them
- Check disableLanguages / disableKinds settings before invoking a build
- Validate loaded config (site/language count) before calling the build API
When it happens
Trigger: NewHugoSites/site setup where every configured language is filtered out — e.g. disableLanguages listing all defined languages, or a languages config block that resolves to zero buildable languages.
Common situations: Multilingual configs where disableLanguages accidentally includes every language (often via environment-specific config merging), a typo making the languages map empty, or module/config mounts pulling in a config that disables the only language.
Related errors
- failed to decode languages config: %w
- failed to create config: %w
- invalid language configuration for %q
- failed to decode config for language %q: %w
- language name cannot be empty
AI-assisted analysis of gohugoio/hugo@8a468df065 (2026-07-31).
Data as JSON: /data/errors/e337ab51006c9e32.json.
Report an issue: GitHub ↗.