{"record":{"id":"f3b43c789ccf6b91","repo":"fatedier/frp","slug":"plugin-s-is-not-registered-f3b43c","errorCode":null,"errorMessage":"plugin [%s] is not registered","messagePattern":"plugin \\[(.+?)\\] is not registered","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/plugin/visitor/plugin.go","lineNumber":58,"sourceCode":"}\n\n// Creators is used for create plugins to handle connections.\nvar creators = make(map[string]CreatorFn)\n\ntype CreatorFn func(pluginCtx PluginContext, options v1.VisitorPluginOptions) (Plugin, error)\n\nfunc Register(name string, fn CreatorFn) {\n\tif _, exist := creators[name]; exist {\n\t\tpanic(fmt.Sprintf(\"plugin [%s] is already registered\", name))\n\t}\n\tcreators[name] = fn\n}\n\nfunc Create(pluginName string, pluginCtx PluginContext, options v1.VisitorPluginOptions) (p Plugin, err error) {\n\tif fn, ok := creators[pluginName]; ok {\n\t\tp, err = fn(pluginCtx, options)\n\t} else {\n\t\terr = fmt.Errorf(\"plugin [%s] is not registered\", pluginName)\n\t}\n\treturn\n}\n\ntype Plugin interface {\n\tName() string\n\tStart()\n\tClose() error\n}\n","sourceCodeStart":40,"sourceCodeEnd":68,"githubUrl":"https://github.com/fatedier/frp/blob/6c8a8d0a97d03b44e9528d30b30c70cb9d61b405/pkg/plugin/visitor/plugin.go#L40-L68","documentation":"Visitor-side plugin factory lookup failed: Create() found no CreatorFn registered under the requested name in the visitor plugin registry. This registry is separate from the client proxy-plugin registry and currently holds few entries (e.g. virtual_net), so most names are simply not visitor plugins.","triggerScenarios":"A visitor config whose [visitors.plugin].type does not match a registered visitor plugin name — typo, or trying to use a proxy-side plugin name in a visitor block.","commonSituations":"Config copy-paste putting an http/socks5 proxy plugin type into a visitor section; misspelled \"virtual_net\"; plugin exists only in newer frp versions.","solutions":["Use a valid visitor plugin type for your frp version (e.g. virtual_net for virtual network visitors)","Fix typos in [visitors.plugin].type","Upgrade frpc if the visitor plugin you need shipped in a later release"],"exampleFix":"// before\n[[visitors]]\nname = \"vn\"\ntype = \"stty\"\n[visitors.plugin]\ntype = \"virtualnet\"\n\n// after\ntype = \"stty\"\n[visitors.plugin]\ntype = \"virtual_net\"","handlingStrategy":"validation","validationCode":"visitorPlugins := map[string]bool{\"virtual_net\": true}\nif !visitorPlugins[cfg.Visitor.Plugin.Type] {\n    return fmt.Errorf(\"unknown visitor plugin %q\", cfg.Visitor.Plugin.Type)\n}","typeGuard":null,"tryCatchPattern":"if _, err := visitorplugin.Create(name, vCtx, opts); err != nil {\n    if strings.Contains(err.Error(), \"is not registered\") {\n        return fmt.Errorf(\"config error: %w (check visitor plugin type)\", err)\n    }\n    return err\n}","preventionTips":["Don't reuse proxy-plugin type names in visitor blocks — registries differ","Validate visitor config sections separately from proxy sections"],"tags":["plugin","visitor","configuration","registry","go"],"backgroundTag":null,"analyzedSha":"6c8a8d0a97d03b44e9528d30b30c70cb9d61b405","analyzedAt":"2026-08-15T06:53:27.215Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}