# Creating Your First Plugin

Plugins consist of two things. First, a meta-data file describing the plugin which includes things like a name, the author, and where to find the plugin. Second, the plugin code which can take the form of a shared library or python module.

Builder supports writing plugins in C, C++, Vala, or Python. We will be using Python for our examples in this tutorial because it is both succinct and easy to get started with.

First, we will look at our plugin meta-data file. The file should have the file-suffix of ”.plugin” and it’s format is familiar. It starts with a line containing “[Plugin]” indicating this is plugin meta-data. Then it is followed by a series of “Key=Value” key-pairs.

    # my_plugin.plugin
    [Plugin]
    Name=My Plugin
    Loader=python3
    Module=my_plugin
    Author=Angela Avery

Now we can create a simple plugin that will print “hello” when Builder starts and “goodbye” when Builder exits.

    # my_plugin.py

    import gi

    from gi.repository import GObject
    from gi.repository import Ide

    class MyAppAddin(GObject.Object, Ide.ApplicationAddin):

        def do_load(self, application):
            print("hello")

        def do_unload(self, application):
            print("goodbye")

In the python file above, we define a new extension called `MyAppAddin`. It inherits from `GObject.Object` (which is our base object) and implements the interface `Ide.ApplicationAddin`. We wont get too much into objects and interfaces here, but the plugin manager uses this information to determine when and how to load our extension.

The `Ide.ApplicationAddin` requires that two methods are implemented. The first is called `do_load` and is executed when the extension should load. And the second is called `do_unload` and is executed when the plugin should cleanup after itself. Each of the two functions take a parameter called `application` which is an `Ide.Application` instance.

## Loading our Plugin

Now place the two files in `~/.local/share/gnome-builder/plugins` as `my_plugin.plugin` and `my_plugin.py`. If we run Builder from the command line, we should see the output from our plugin!

    [angela@localhost ~] gnome-builder
    hello

Now if we close the window, we should see that our plugin was unloaded.

    [angela@localhost ~] gnome-builder
    hello
    goodbye

Next, continue on to learn about other interfaces you can implement in Builder to extend it’s features!