Make Quorum show your data your way.
A Quorum plugin adds a way to look at or save the rows you are looking at: a result view, an exporter, a chart type, a snippet pack or a colour theme. It is a small folder, or a zip of one, with a manifest.json and its files.
{
"id": "yourname.cards",
"name": "Cards",
"version": "1.0.0",
"minQuorumVersion": "4.0.0",
"contributes": {
"resultViews": [{ "id": "cards",
"name": "Cards", "entry": "cards.js" }]
}
}Get Quorum's plugins.
Four ready-made plugins. Download a zip and add it in Quorum.
Pivot
Summarise the rows: a field for rows, optionally one for columns, and a value to count, sum, average, or take the smallest or largest of; totals per row and column.
JSON explorer
Each row as an expandable tree; JSON in a cell (MongoDB sub-documents, PostgreSQL json columns) opens field by field; search finds a key or value.
Confluence and Jira tables
The rows as a Jira or Confluence wiki table, a Markdown table, or an HTML table that the Confluence editor keeps as a native table when pasted.
DBA snippets
Read-only queries for PostgreSQL, SQL Server and MySQL: who is blocking whom, long-running queries, largest tables, unused and missing indexes, waits.
What a plugin can add.
Result view
A new way to look at the rows.
Exporter
A new file format to save the rows as.
Chart type
A chart Quorum does not draw itself.
Snippet pack
SQL you insert into the editor.
Theme
Quorum's colours, light and dark.
Your own plugin in four steps.
- In Quorum, Settings › General › Plugins › Save a starter plugin…, or download the starter and unzip it. It is a working result view (Column summary) with comments, a manifest and a README.
- Change
manifest.json(your own id and name) andview.js. - Click Add plugin folder… and pick the folder. Quorum checks it and keeps its own copy, so add it again after each change.
- To share it, zip the folder. Others add it with Add plugin (.zip)….
manifest.json
- id3 to 64 lower-case letters, digits, "." and "-".
- ContributionsAt least one, at most 20 of each kind.
- FilesNamed relative to the folder with "/"; only manifest.json and the files it names are copied.
- StrictUnknown fields are errors.
{
"id": "yourname.cards",
"name": "Cards",
"version": "1.0.0",
"author": "You",
"description": "Rows as cards.",
"minQuorumVersion": "4.0.0",
"contributes": {
"resultViews": [{ "id": "cards", "name": "Cards", "entry": "cards.js", "style": "cards.css" }],
"exporters": [{ "id": "tsv", "name": "TSV", "entry": "tsv.js", "extension": "tsv" }],
"chartTypes": [{ "id": "heat", "name": "Heat map", "entry": "heat.js" }],
"snippets": [{ "id": "basics", "name": "Basics", "file": "basics.json" }],
"themes": [{ "id": "ocean", "name": "Ocean", "file": "ocean.json" }]
}
}What the script receives
Views, exporters and chart types run in a sandboxed frame and talk to Quorum only with postMessage.
This is sent when the view opens and again when the rows or theme change.
{
type: 'quorum:render', apiVersion: 1,
kind: 'resultView' | 'chartType' | 'exporter',
columns: [{ name: 'id', type: 'integer' }, ...],
rows: [[1, 'Ada', null], ...], // strings, numbers, booleans, null
rowCount: 1200, truncated: false,
theme: { mode: 'dark' | 'light', tokens: { '--q-bg-1': '#0c0e12', ... } },
chart: { x: 'month', y: ['revenue'] } // chart types only
}What it may send back
A view or chart type sends its height (resized between 40 and 10,000 pixels).
An exporter sends one file; Quorum checks it and shows the save dialog. Use encoding: 'base64' for binary files.
Snippet packs are a JSON list of { "name", "sql", "dialect" } (dialect null for every database). Themes set Quorum's colour tokens for dark and light.
parent.postMessage({ type: 'quorum:height', apiVersion: 1, height: 640 }, '*')parent.postMessage({
type: 'quorum:export', apiVersion: 1,
fileName: 'results.tsv', mimeType: 'text/tab-separated-values',
encoding: 'utf8', content: '...'
}, '*')