gohugoio/hugo · critical

no sites to build

Error message

no sites to build

What it means

Thrown at the end of site construction in hugolib/site.go:412 when the per-language site loop produced zero sites. The loop iterates confm.ConfigLangs(); if that yields no enabled language, no Site is created and the build cannot continue.

Solutions

  1. Check disableLanguages in hugo.toml and ensure at least one language remains enabled.
  2. Verify the [languages] block exists with at least one entry (e.g. [languages.en]).
  3. Run hugo config and confirm the resolved languages list is non-empty.

Example fix

// before
disableLanguages = ["en","fr"]
// after
disableLanguages = ["fr"]
Defensive patterns

Strategy: validation

Validate before calling

// Assert at least one enabled language remains.
// In CI: hugo config | grep -q '^languages\[' || exit 1

Prevention

When it happens

Trigger: All languages disabled via disableLanguages, an empty/nil languages configuration, or every language marked Disabled in the config map. Also reachable if ConfigLangs filtering removes all entries.

Common situations: Setting disableLanguages = ['en','fr',...] listing every configured language, or removing the defaultLanguageSetting while also disabling the fallback, or a config merge that nukes the languages block.

Related errors


AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09). Data as JSON: /api/errors/e337ab51006c9e32. Report an issue: GitHub.

Appendix: 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 52c9bd7908)