id,page,ref,title,content,breadcrumbs,references writing_plugins:writing-plugins-extra-hooks,writing_plugins,writing-plugins-extra-hooks,Plugins that define new plugin hooks,"Plugins can define new plugin hooks that other plugins can use to further extend their functionality. datasette-graphql is one example of a plugin that does this. It defines a new hook called graphql_extra_fields , described here , which other plugins can use to define additional fields that should be included in the GraphQL schema. To define additional hooks, add a file to the plugin called datasette_your_plugin/hookspecs.py with content that looks like this: from pluggy import HookspecMarker hookspec = HookspecMarker(""datasette"") @hookspec def name_of_your_hook_goes_here(datasette): ""Description of your hook."" You should define your own hook name and arguments here, following the documentation for Pluggy specifications . Make sure to pick a name that is unlikely to clash with hooks provided by any other plugins. Then, to register your plugin hooks, add the following code to your datasette_your_plugin/__init__.py file: from datasette.plugins import pm from . import hookspecs pm.add_hookspecs(hookspecs) This will register your plugin hooks as part of the datasette plugin hook namespace. Within your plugin code you can trigger the hook using this pattern: from datasette.plugins import pm for ( plugin_return_value ) in pm.hook.name_of_your_hook_goes_here( datasette=datasette ): # Do something with plugin_return_value pass Other plugins will then be able to register their own implementations of your hook using this syntax: from datasette import hookimpl @hookimpl def name_of_your_hook_goes_here(datasette): return ""Response from this plugin hook"" These plugin implementations can accept 0 or more of the named arguments that you defined in your hook specification.","[""Writing plugins""]","[{""href"": ""https://github.com/simonw/datasette-graphql"", ""label"": ""datasette-graphql""}, {""href"": ""https://github.com/simonw/datasette-graphql/blob/main/README.md#adding-custom-fields-with-plugins"", ""label"": ""described here""}, {""href"": ""https://pluggy.readthedocs.io/en/stable/#specs"", ""label"": ""Pluggy specifications""}]"