projectdiscovery/nuclei · warning

could not find any templates with tech tag

Error message

could not find any templates with tech tag

What it means

Raised by LoadTemplatesWithTags in the automatic-scan (tech-detect) flow. The template store was queried for templates carrying the detected technology tags (opts.Store.LoadTemplatesWithTags) and returned an empty list, meaning no loaded template is tagged with any of the target's detected technologies. It is returned before clustering/executing anything, so the automatic scan stops for that target.

Source

Thrown at pkg/protocols/common/automaticscan/util.go:45

			return nil, errors.Wrap(err, "could not get templates in directory")
		}
		allTemplates = append(allTemplates, templates...)
	}
	allTemplates = sliceutil.Dedupe(allTemplates)
	if len(allTemplates) == 0 {
		return nil, fmt.Errorf("%w for given input", disk.ErrNoTemplatesFound)
	}
	return allTemplates, nil
}

// LoadTemplatesWithTags loads and returns templates with given tags
func LoadTemplatesWithTags(opts Options, templateDirs []string, tags []string, logInfo bool) ([]*templates.Template, error) {
	finalTemplates, err := opts.Store.LoadTemplatesWithTags(templateDirs, tags)
	if err != nil {
		return nil, errors.Wrap(err, "could not load templates")
	}
	if len(finalTemplates) == 0 {
		return nil, errors.New("could not find any templates with tech tag")
	}

	if !opts.ExecuterOpts.Options.DisableClustering {
		// cluster and reduce requests
		totalReqBeforeCluster := getRequestCount(finalTemplates) * int(opts.Target.Count())
		finalTemplates, clusterCount, _ := templates.ClusterTemplates(finalTemplates, opts.ExecuterOpts)
		totalReqAfterClustering := getRequestCount(finalTemplates) * int(opts.Target.Count())
		if totalReqAfterClustering < totalReqBeforeCluster && logInfo {
			opts.ExecuterOpts.Logger.Info().Msgf("Automatic scan tech-detect: Templates clustered: %d (Reduced %d Requests)", clusterCount, totalReqBeforeCluster-totalReqAfterClustering)
		}
	}

	// log template loaded if VerboseVerbose flag is set
	if opts.ExecuterOpts.Options.VerboseVerbose {
		for _, tpl := range finalTemplates {
			opts.ExecuterOpts.Logger.Print().Msgf("%s\n", templates.TemplateLogMessage(tpl.ID,
				types.ToString(tpl.Info.Name),
				tpl.Info.Authors.ToSlice(),

View on GitHub (pinned to 265b3a3dec)

Solutions

  1. Include the full nuclei-templates directory so technology-tagged templates are available
  2. Verify the tag exists in your store: nuclei -tl lists available template tags
  3. Check that -tags/-etag/-ntags filters are not excluding the matching templates
  4. For niche techs, add a custom template carrying the technology as a tag
Defensive patterns

Strategy: validation

Validate before calling

tags := detectedTechTags(target) // from wappalyzergo/tech-detect
available := opts.Store.Tags() // or `nuclei -tl` output parsed once
for _, t := range tags {
    if !available[t] { log.Warnf("no templates tagged %s; skipping", t) }
}

Try / catch

templates, err := automaticscan.LoadTemplatesWithTags(opts, dirs, tags, false)
if err != nil && strings.Contains(err.Error(), "could not find any templates with tech tag") {
    // degrade gracefully: continue scan without tech-specific templates
}

Prevention

When it happens

Trigger: Running an automatic scan against a host where tech-detect identifies e.g. 'packer' or a niche CMS, while the loaded template directories contain no template tagged with that technology.

Common situations: Pointing -templates at a small custom directory that lacks tech tags; running with -ntags/-etag filters that excluded the tagged templates; a very new/niche technology with no upstream template yet.

Related errors


AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15). Data as JSON: /api/errors/d34158e885b5dc21. Report an issue: GitHub.