kataras/iris · error

%s extension is not a valid jet engine extension[%s]

Error message

%s extension is not a valid jet engine extension[%s]

What it means

The jet view engine only supports the fixed extension set .html.jet, .jet.html, and .jet because the vendored jet loader registers handlers per extension and cannot be reconfigured. Passing any other extension to view.Jet makes the engine refuse to start with this formatted panic listing the valid options.

Source

Thrown at view/jet.go:73

// Jet creates and returns a new jet view engine.
// The given "extension" MUST begin with a dot.
//
// Usage:
// Jet("./views", ".jet") or
// Jet(iris.Dir("./views"), ".jet") or
// Jet(embed.FS, ".jet") or Jet(AssetFile(), ".jet") for embedded data.
func Jet(dirOrFS any, extension string) *JetEngine {
	extOK := false
	for _, ext := range jetExtensions {
		if ext == extension {
			extOK = true
			break
		}
	}

	if !extOK {
		panic(fmt.Sprintf("%s extension is not a valid jet engine extension[%s]", extension, strings.Join(jetExtensions[0:], ", ")))
	}

	s := &JetEngine{
		fs:                getFS(dirOrFS),
		rootDir:           "/",
		extension:         extension,
		loader:            &jetLoader{fs: getFS(dirOrFS)},
		jetDataContextKey: "_jet",
	}

	return s
}

// String returns the name of this view engine, the "jet".
func (s *JetEngine) String() string {
	return jetEngineName
}

View on GitHub (pinned to 7bedaf55a0)

Solutions

  1. Use one of the supported extensions: view.Jet("./views", ".jet") (or .html.jet / .jet.html).
  2. Rename your template files to carry a supported extension (e.g. index.gohtml -> index.jet).
  3. If you need other extensions, use a different engine (HTML/Django) or a custom loader outside view.Jet.

Example fix

// before
eng := view.Jet("./views", ".gohtml") // panic: not a valid jet extension
// after
eng := view.Jet("./views", ".jet")
Defensive patterns

Strategy: validation

Validate before calling

valid := map[string]bool{".jet": true, ".html.jet": true, ".jet.html": true}
if !valid[ext] {
	log.Fatalf("extension %q unsupported by jet engine", ext)
}

Type guard

func isJetExtension(ext string) bool {
	switch ext {
	case ".jet", ".html.jet", ".jet.html":
		return true
	}
	return false
}

Try / catch

defer func() {
	if r := recover(); strings.Contains(fmt.Sprint(r), "valid jet engine extension") {
		log.Fatalf("bad jet extension: %v", r)
	}
}()

Prevention

When it happens

Trigger: view.Jet("./views", ".gohtml"), ".html", ".tmpl" or any extension not in the jetExtensions list — the extOK loop finds no match and panics.

Common situations: Copy-pasting engine setup from the HTML engine docs (which use .html), migrating a project from html/django to jet without renaming template files, or inventing extensions like .jet.tmpl.

Related errors


AI-assisted analysis of kataras/iris@7bedaf55a0 (2026-08-30). Data as JSON: /api/errors/2b488a6cba753058. Report an issue: GitHub.