+++ title = "Legacy review guidelines" aliases = ["/docs/grafana/latest/plugins/developing/plugin-review-guidelines/"] +++ # Legacy review guidelines The Grafana team reviews all plugins that are published on Grafana.com. There are two areas we review, the metadata for the plugin and the plugin functionality. ## Metadata The plugin metadata consists of a `plugin.json` file and the README.md file. The `plugin.json` file is used by Grafana to load the plugin, and the README.md file is shown in the plugins section of Grafana and the plugins section of https://grafana.com. ### README.md The README.md file is shown on the plugins page in Grafana and the plugin page on Grafana.com. There are some differences between the GitHub markdown and the markdown allowed in Grafana/Grafana.com: - Cannot contain inline HTML. - Any image links should be absolute links. For example: https://raw.githubusercontent.com/grafana/azure-monitor-datasource/master/dist/img/grafana_cloud_install.png The README should: - describe the purpose of the plugin. - contain steps on how to get started. ### Plugin.json The `plugin.json` file is the same concept as the `package.json` file for an npm package. When the Grafana server starts it will scan the plugin folders (all folders in the data/plugins subfolder) and load every folder that contains a `plugin.json` file unless the folder contains a subfolder named `dist`. In that case, the Grafana server will load the `dist` folder instead. A minimal `plugin.json` file: ```json { "type": "panel", "name": "Clock", "id": "yourorg-clock-panel", "info": { "description": "Clock panel for grafana", "author": { "name": "Author Name", "url": "http://yourwebsite.com" }, "keywords": ["clock", "panel"], "version": "1.0.0", "updated": "2018-03-24" }, "dependencies": { "grafanaVersion": "3.x.x", "plugins": [] } } ``` - The convention for the plugin id is **[grafana.com username/org]-[plugin name]-[datasource|app|panel]** and it has to be unique. The org **cannot** be `grafana` unless it is a plugin created by the Grafana core team. Examples: - raintank-worldping-app - ryantxu-ajax-panel - alexanderzobnin-zabbix-app - hawkular-datasource - The `type` field should be either `datasource` `app` or `panel`. - The `version` field should be in the form: x.x.x e.g. `1.0.0` or `0.4.1`. The full file format for `plugin.json` file is in [plugin.json](http://docs.grafana.org/plugins/developing/plugin.json/). ## Plugin Language JavaScript, TypeScript, ES6 (or any other language) are all fine as long as the contents of the `dist` subdirectory are transpiled to JavaScript (ES5). ## File and Directory Structure Conventions Here is a typical directory structure for a plugin. ```bash johnnyb-awesome-datasource |-- dist |-- src | |-- img | | |-- logo.svg | |-- partials | | |-- annotations.editor.html | | |-- config.html | | |-- query.editor.html | |-- datasource.js | |-- module.js | |-- plugin.json | |-- query_ctrl.js |-- Gruntfile.js |-- LICENSE |-- package.json |-- README.md ``` Most JavaScript projects have a build step. The generated JavaScript should be placed in the `dist` directory and the source code in the `src` directory. We recommend that the plugin.json file be placed in the src directory and then copied over to the dist directory when building. The `README.md` can be placed in the root or in the dist directory. Directories: - `src/` contains plugin source files. - `src/partials` contains html templates. - `src/img` contains plugin logos and other images. - `dist/` contains built content. ## HTML and CSS For the HTML on editor tabs, we recommend using the inbuilt Grafana styles rather than defining your own. This makes plugins feel like a more natural part of Grafana. If done correctly, the html will also be responsive and adapt to smaller screens. The `gf-form` css classes should be used for labels and inputs. Below is a minimal example of an editor row with one form group and two fields, a dropdown and a text input: ```html