derailed/k9s · error

no tree renderer defined for this resource

Error message

no tree renderer defined for this resource

What it means

treeHydrate fans out per-object rendering to a TreeRenderer via a worker pool. A nil renderer means no code path knows how to draw children for this resource, so hydration is refused before any work is dispatched.

Source

Thrown at internal/model/tree.go:294

// ----------------------------------------------------------------------------
// Helpers...

func rxMatch(q, path string) bool {
	rx := regexp.MustCompile(`(?i)` + q)

	tokens := strings.Split(path, "::")
	for _, t := range tokens {
		if rx.MatchString(t) {
			return true
		}
	}
	return false
}

func treeHydrate(ctx context.Context, ns string, oo []runtime.Object, re TreeRenderer) error {
	if re == nil {
		return fmt.Errorf("no tree renderer defined for this resource")
	}
	pool := internal.NewWorkerPool(ctx, internal.DefaultPoolSize)
	for _, o := range oo {
		pool.Add(func(_ context.Context) error {
			return re.Render(ctx, ns, o)
		})
	}
	errs := pool.Drain()
	if len(errs) > 0 {
		return errs[0]
	}

	return nil
}

func genericTreeHydrate(ctx context.Context, ns string, table *metav1.Table, re TreeRenderer) error {
	tre, ok := re.(*xray.Generic)
	if !ok {

View on GitHub (pinned to 2d3ccc6ba2)

Solutions

  1. Check views/skin config for tree/custom view overrides on that resource and remove them
  2. Ensure a TreeRenderer is registered for the GVR before building the tree model
  3. Upgrade k9s: renderer coverage for the resource may exist in a newer release
Defensive patterns

Strategy: validation

Validate before calling

// Guard in the caller before hydrating.
if renderer == nil {
    return fmt.Errorf("tree view unavailable for %s (no renderer registered)", gvr)
}
err := treeHydrate(ctx, ns, objs, renderer)

Type guard

func hasRenderer(r TreeRenderer) bool { return r != nil }

Try / catch

if err := treeHydrate(ctx, ns, oo, re); err != nil && strings.Contains(err.Error(), "no tree renderer") {
    // fall back to a flat list view for this GVR
    return openListViewFor(gvr)
}

Prevention

When it happens

Trigger: Loading a tree view for a resource whose renderer was never registered — custom views/skins referencing a GVR with no tree renderer, or a code path calling treeHydrate without passing the renderer from the registry.

Common situations: Custom views.yaml/skin entries that enable tree mode for unsupported resources; k9s versions where a new tree feature is enabled for a GVR whose renderer landed later.

Related errors


AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15). Data as JSON: /api/errors/aab5ec929bf68a25. Report an issue: GitHub.