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
- Use one of the supported extensions: view.Jet("./views", ".jet") (or .html.jet / .jet.html).
- Rename your template files to carry a supported extension (e.g. index.gohtml -> index.jet).
- 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
- Always use one of .jet, .html.jet, .jet.html when calling view.Jet.
- Rename template files when migrating from other engines.
- Keep the extension in a shared constant next to engine setup.
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.