{
 "generatedFrom": "https://github.com/visokio/omniscope-custom-views",
 "kind": "views",
 "statement": "Items tagged visokio-agents are community examples built by Visokio's agents, to extend Omniscope's core blocks and views with popular, specialist and more unusual use cases, and to show what anyone, people or agents, can build on Omniscope. They are tested by automated tests and were run on a real Omniscope server. They were not reviewed by Omniscope's core team, so they are not on a par with the core blocks and views, which have years of manual, functional and unit tests behind them.",
 "items": [
  {
   "id": "abcxyz",
   "name": "ABC-XYZ Analysis",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "Thousands of products, nine ways to manage them. Classify every item by its value and by how predictable its demand is, and see where the stock, the risk and the effort should go.",
   "tags": [
    "custom",
    "abc analysis",
    "xyz analysis",
    "inventory",
    "pareto",
    "demand variability",
    "supply chain",
    "stock",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "item",
     "title": "Items",
     "type": "FIELD",
     "description": "The product, SKU or part to classify"
    },
    {
     "name": "date",
     "title": "Dated by",
     "type": "FIELD",
     "description": "Date of each sale, issue or order line"
    },
    {
     "name": "demand",
     "title": "Demand",
     "type": "FIELD",
     "description": "Units sold, issued or ordered"
    },
    {
     "name": "value",
     "title": "Value",
     "type": "FIELD",
     "description": "Optional: revenue or cost to rank by (default: units)"
    }
   ],
   "options": [
    {
     "name": "period",
     "title": "Period",
     "type": "CHOICE",
     "description": "Period over which demand variability is measured (default month)"
    },
    {
     "name": "aShare",
     "title": "A share %",
     "type": "NUMBER",
     "description": "A items make up this share of value (default 80)"
    },
    {
     "name": "bShare",
     "title": "A and B share %",
     "type": "NUMBER",
     "description": "A and B items together make up this share (default 95)"
    },
    {
     "name": "xCV",
     "title": "X up to CV",
     "type": "NUMBER",
     "description": "Coefficient of variation limit for X, steady demand (default 0.5)"
    },
    {
     "name": "yCV",
     "title": "Y up to CV",
     "type": "NUMBER",
     "description": "Coefficient of variation limit for Y, variable demand (default 1.0)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Pareto** view ranks items by value, which covers only the ABC part. This view adds demand variability (XYZ) and shows the nine classes as a matrix with a typical stock policy for each.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pareto",
     "page": null,
     "note": "The ABC ranking by value, without demand variability."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/ABC-Classification",
     "name": "ABC Classification",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/ABC-Classification/index.html",
     "note": "Classifies the same way in the workflow, optionally within groups such as warehouse. Use it when each item's class is needed as a field, for joins, exports or stock rules; use this view to explore the classes in a report."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "concentration",
     "name": "Concentration",
     "page": "https://visokio.github.io/omniscope-custom-views/concentration/index.html",
     "note": "How concentrated value is across items: Lorenz curve, Gini and top shares."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/abcxyz/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/abcxyz",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/abcxyz/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/abcxyz/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/abcxyz/sample-data/sku_demand.csv"
    ]
   }
  },
  {
   "id": "abtest",
   "name": "A/B Test",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "Did the change work? Read experiment results correctly, with intervals, significance and a plain verdict, straight from your test data in an Omniscope report.",
   "tags": [
    "custom",
    "a/b test",
    "experiment",
    "conversion",
    "significance",
    "uplift",
    "statistics",
    "marketing",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "variant",
     "title": "Variants",
     "type": "FIELD",
     "description": "Which version each visitor, customer or unit was given, e.g. Variant, Arm, Test group"
    },
    {
     "name": "outcome",
     "title": "Outcome",
     "type": "FIELD",
     "description": "1 or 0 for a conversion, or a value such as Order value or Time on site"
    },
    {
     "name": "segment",
     "title": "Break down by",
     "type": "FIELD",
     "description": "Optional: show the uplift within each group, e.g. Device or Customer type"
    }
   ],
   "options": [
    {
     "name": "control",
     "title": "Control",
     "type": "TEXT",
     "description": "Name of the control variant (default: one named like control, current or A, otherwise the first)"
    },
    {
     "name": "kind",
     "title": "Outcome is",
     "type": "CHOICE",
     "description": "Automatic treats outcomes that are all 0 or 1 as conversions"
    },
    {
     "name": "better",
     "title": "Better is",
     "type": "CHOICE",
     "description": "Direction of improvement"
    },
    {
     "name": "confidence",
     "title": "Confidence",
     "type": "CHOICE",
     "description": "Confidence level for intervals and significance (default 95%)"
    },
    {
     "name": "adjust",
     "title": "Adjust for several variants",
     "type": "TOGGLE",
     "description": "Bonferroni correction when more than one variant is compared with the control"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Bar** view can show rates by variant, but not whether a difference is real. This view reads an experiment's result in a report, with intervals, significance and a verdict for each variant.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/AB-Test",
     "name": "A/B Test",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/AB-Test/index.html",
     "note": "Runs the same tests in the workflow, also from per-variant totals, with the sample size each variant would need. Use it for a results table you can keep or test across several segments; use this view to read the result in a report."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Bar",
     "page": null,
     "note": "Rates by variant, without intervals or significance."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Sample-Size-Calculator",
     "name": "Sample Size Calculator",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Sample-Size-Calculator/index.html",
     "note": "Works out before the test how many visitors it needs and how many days it should run."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/abtest/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/abtest",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/abtest/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/abtest/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/abtest/sample-data/checkout_test.csv"
    ]
   }
  },
  {
   "id": "barchartrace",
   "name": "Bar Chart Race",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "Turn a ranking over time into a story people watch to the end: who led, who overtook, and when.",
   "tags": [
    "custom",
    "bar chart race",
    "animation",
    "ranking",
    "race",
    "over time",
    "storytelling",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "time",
     "title": "Time",
     "type": "GROUPING",
     "description": "The frames of the race, e.g. Month or Year (a date grouped by month works well)"
    },
    {
     "name": "item",
     "title": "Bars",
     "type": "GROUPING",
     "description": "What races, e.g. Product, Town, Team or Brand"
    },
    {
     "name": "value",
     "title": "Value",
     "type": "MEASURE",
     "description": "Bar length, e.g. sum of Sales"
    },
    {
     "name": "colour",
     "title": "Colour by",
     "type": "GROUPING",
     "description": "Optional category for bar colours, e.g. Region (up to eight colours)"
    }
   ],
   "options": [
    {
     "name": "cumulative",
     "title": "Running total",
     "type": "TOGGLE",
     "description": "Race the running total up to each period instead of each period's own value"
    },
    {
     "name": "topN",
     "title": "Bars shown",
     "type": "NUMBER",
     "description": "Number of bars in the race (default 10)"
    },
    {
     "name": "duration",
     "title": "Seconds per period",
     "type": "NUMBER",
     "description": "Speed of the animation (default 0.8)"
    },
    {
     "name": "autoplay",
     "title": "Play automatically",
     "type": "TOGGLE",
     "description": "Start playing when the report opens"
    },
    {
     "name": "loop",
     "title": "Loop",
     "type": "TOGGLE",
     "description": "Start again after the last period"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The race animates a ranking through time, a format for presentations, screens and social media; for analysis, the community **Bump Chart** suits better.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Bar",
     "page": null,
     "note": "The same ranked bars for one period, without the animation over time."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "bumpchart",
     "name": "Bump Chart",
     "page": "https://visokio.github.io/omniscope-custom-views/bumpchart/index.html",
     "note": "Rank over time as lines, all periods at once."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "motionbubbles",
     "name": "Motion Bubbles",
     "page": "https://visokio.github.io/omniscope-custom-views/motionbubbles/index.html",
     "note": "Also plays through time, with bubbles on two axes."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/barchartrace/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/barchartrace",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/barchartrace/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/barchartrace/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/barchartrace/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "beeswarm",
   "name": "Beeswarm",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Every item as its own dot, none hidden behind another. The shape of a distribution, without losing the individual stores, people or orders that make it.",
   "tags": [
    "custom",
    "bee",
    "swarm",
    "circle",
    "dot",
    "jitter"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "colour",
     "title": "Colour",
     "type": "MEASURE",
     "description": "Colours the dots by category: for example Region with the Singleton function, which gives each dot its one Region"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "One chart per value, side by side"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "One chart per value, one above the other"
    },
    {
     "name": "split",
     "title": "Split",
     "type": "GROUPING",
     "description": "One dot per value of this grouping, for example per Store"
    },
    {
     "name": "title",
     "title": "Tooltip",
     "type": "MEASURE",
     "description": "Text shown first in a dot's tooltip, for example a name field with the Singleton function. If empty, the Split value is shown"
    },
    {
     "name": "x",
     "title": "X",
     "type": "MEASURE",
     "description": "Position along the horizontal axis, for example the sum of Sales growth. If empty, the dots are packed around the centre"
    },
    {
     "name": "y",
     "title": "Y",
     "type": "MEASURE",
     "description": "Position along the vertical axis. If empty, the dots are packed around the middle line"
    }
   ],
   "options": [],
   "outputs": [],
   "libraries": [
    "d3 4.13.0"
   ],
   "relatedSummary": "A beeswarm keeps one dot per item, up to 1,000, pushed apart so none hides another, where the core **Box Plot** and the community **Distribution** view hide the individual items.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Box Plot",
     "page": null,
     "note": "Summarises each group's distribution in five numbers, without showing the items."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Scatter",
     "page": null,
     "note": "Places items by two measures, but points can hide each other where they pile up."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "distribution",
     "name": "Distribution",
     "page": "https://visokio.github.io/omniscope-custom-views/distribution/index.html",
     "note": "A histogram with percentiles and outliers, for datasets too large for one dot each."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "ridgeline",
     "name": "Ridgeline",
     "page": "https://visokio.github.io/omniscope-custom-views/ridgeline/index.html",
     "note": "Distribution shapes for many categories, stacked."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/beeswarm/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/beeswarm",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/beeswarm/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/beeswarm/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/beeswarm/sample-data/stores.csv"
    ]
   }
  },
  {
   "id": "benford",
   "name": "Benford Analysis",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "Spot the numbers that do not look natural. Benford's law screening for payments, invoices and expense claims, with the groups that stand out and the records behind them one click away.",
   "tags": [
    "custom",
    "benford",
    "audit",
    "fraud",
    "forensic",
    "first digit",
    "anomaly",
    "compliance",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "value",
     "title": "Amounts",
     "type": "FIELD",
     "description": "Naturally occurring values: payments, invoices, expense claims, transactions"
    },
    {
     "name": "group",
     "title": "Compare by",
     "type": "FIELD",
     "description": "Optional: rank groups by how far they depart from Benford, e.g. Supplier, Approver, Branch"
    }
   ],
   "options": [
    {
     "name": "digits",
     "title": "Test",
     "type": "CHOICE",
     "description": "The first-two-digits test is the most precise for spotting amounts kept under a limit"
    },
    {
     "name": "minValue",
     "title": "Ignore values below",
     "type": "NUMBER",
     "description": "Small values are usually excluded (default 10)"
    },
    {
     "name": "negatives",
     "title": "Include negatives",
     "type": "TOGGLE",
     "description": "Analyse negative values by their absolute size (credit notes, refunds)"
    },
    {
     "name": "minGroup",
     "title": "Minimum values per group",
     "type": "NUMBER",
     "description": "Groups with fewer values are not ranked (default 100)"
    },
    {
     "name": "maxRows",
     "title": "Values used",
     "type": "NUMBER",
     "description": "Maximum records fetched (default 500,000)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Bar** view can draw first-digit counts from a derived field, but not the curve Benford's law expects or the conformity tests. This view runs the screening in a report, ranks suppliers, approvers or branches by how far they depart, and selects the records behind a digit.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Benford-Test",
     "name": "Benford's Law Test",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Benford-Test/index.html",
     "note": "Runs the same tests in the workflow and outputs the records behind the over-represented digits. Use it to keep the results or hand flagged records on for follow-up; use this view to explore interactively."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Bar",
     "page": null,
     "note": "First digits as bars with a derived field, without the expected curve or tests."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/benford/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/benford",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/benford/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/benford/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/benford/sample-data/payments.csv"
    ]
   }
  },
  {
   "id": "bubblechart",
   "name": "Bubble Chart",
   "category": "Diagram",
   "categories": [
    "Diagram"
   ],
   "subcategory": null,
   "description": "Which few items make up most of the total? Packed bubbles sized by a measure, optionally grouped by category, so the big contributors stand out at once.",
   "tags": [
    "custom",
    "bubble",
    "packed",
    "circles",
    "proportion"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "split",
     "title": "One bubble per",
     "type": "GROUPING",
     "description": "One bubble for each value of this field, for example Product"
    },
    {
     "name": "measures",
     "title": "Size",
     "type": "MEASURE",
     "description": "The bubble's area is proportional to this measure, for example the sum of Revenue. Zero, negative and empty values are not drawn"
    },
    {
     "name": "colour",
     "title": "Group and colour by",
     "type": "GROUPING",
     "description": "Optional. Packs the bubbles into one circle per value of this field, for example Category, and colours them by it. If empty, each bubble is coloured by its own name"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "Optional. One chart per value, side by side"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "Optional. One chart per value, one above the other"
    }
   ],
   "options": [
    {
     "name": "labels",
     "title": "Labels",
     "type": "CHOICE",
     "description": "What to write inside bubbles big enough to hold it"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Packed bubble** view draws the same kind of chart and is the first choice in a report. This view is a short D3 file that is easy to change in the View Designer.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Packed bubble",
     "page": null,
     "note": "Draws the same kind of chart, circles sized by a measure and packed together, and is better integrated with the report."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "motionbubbles",
     "name": "Motion Bubbles",
     "page": "https://visokio.github.io/omniscope-custom-views/motionbubbles/index.html",
     "note": "Bubbles on two axes, animated through time."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/bubblechart/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/bubblechart",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/bubblechart/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/bubblechart/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/bubblechart/sample-data/sales.csv"
    ]
   }
  },
  {
   "id": "building3d",
   "name": "3D Building",
   "category": "Diagram",
   "categories": [
    "Diagram"
   ],
   "subcategory": null,
   "description": "A live 3D model of your buildings, built from data: every floor and zone coloured by occupancy, temperature or energy, and one click from the readings behind it.",
   "tags": [
    "custom",
    "3d",
    "three.js",
    "building",
    "floor plan",
    "digital twin",
    "facilities",
    "occupancy",
    "energy",
    "iot",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "floor",
     "title": "Floor",
     "type": "GROUPING",
     "description": "Floor or level of each zone. Numbers are stacked in order (0 = ground); text floors are stacked alphabetically."
    },
    {
     "name": "zone",
     "title": "Zone",
     "type": "GROUPING",
     "description": "Name of each zone, room or area. Selection filters on Floor and Zone."
    },
    {
     "name": "building",
     "title": "Building",
     "type": "GROUPING",
     "description": "Optional: several buildings are placed side by side"
    },
    {
     "name": "x",
     "title": "Left (x)",
     "type": "MEASURE",
     "description": "Distance of the zone's left edge from the building origin, in metres (or any unit)"
    },
    {
     "name": "y",
     "title": "Front (y)",
     "type": "MEASURE",
     "description": "Distance of the zone's front edge from the building origin"
    },
    {
     "name": "w",
     "title": "Width",
     "type": "MEASURE",
     "description": "Width of the zone along x"
    },
    {
     "name": "d",
     "title": "Depth",
     "type": "MEASURE",
     "description": "Depth of the zone along y"
    },
    {
     "name": "value",
     "title": "Colour by",
     "type": "MEASURE",
     "description": "Measure that colours each zone, e.g. mean of Occupancy, mean of Temperature, sum of Energy"
    }
   ],
   "options": [
    {
     "name": "scale",
     "title": "Colour scale",
     "type": "CHOICE",
     "description": "Diverging uses blue below and red above the midpoint"
    },
    {
     "name": "midpoint",
     "title": "Midpoint",
     "type": "NUMBER",
     "description": "Centre of the diverging scale, e.g. 21 for temperature (default: the middle of the data)"
    },
    {
     "name": "floorHeight",
     "title": "Floor height",
     "type": "NUMBER",
     "description": "Height of each floor in the same unit as the layout (default 3.5)"
    },
    {
     "name": "explode",
     "title": "Gap between floors",
     "type": "NUMBER",
     "description": "Pull floors apart so lower floors are visible (default 3)"
    },
    {
     "name": "labels",
     "title": "Label zones",
     "type": "TOGGLE",
     "description": "Write zone names on the largest zones"
    },
    {
     "name": "theme",
     "title": "Background",
     "type": "CHOICE",
     "description": "Scene background"
    }
   ],
   "outputs": [],
   "libraries": [
    "three 0.147.0"
   ],
   "relatedSummary": null,
   "related": [],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/building3d/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/building3d",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/building3d/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/building3d/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/building3d/sample-data/office.csv"
    ]
   }
  },
  {
   "id": "bumpchart",
   "name": "Bump Chart",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Who is top, who is climbing, who is slipping: the league table of anything, over time, in one picture.",
   "tags": [
    "custom",
    "bump",
    "rank",
    "ranking",
    "league table",
    "over time",
    "slope",
    "position",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "time",
     "title": "Time",
     "type": "GROUPING",
     "description": "The periods to rank in, e.g. Month, Week or Season (a date grouped by month works well)"
    },
    {
     "name": "item",
     "title": "Ranked items",
     "type": "GROUPING",
     "description": "What is ranked in each period, e.g. Product, Store, Team or Keyword"
    },
    {
     "name": "value",
     "title": "Rank by",
     "type": "MEASURE",
     "description": "Measure that decides the rank, e.g. sum of Sales. Highest value is rank 1 unless Lowest first is chosen."
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING"
    }
   ],
   "options": [
    {
     "name": "topN",
     "title": "Ranks shown",
     "type": "NUMBER",
     "description": "Number of ranks on the chart (default 10)"
    },
    {
     "name": "which",
     "title": "Items shown",
     "type": "CHOICE",
     "description": "Which items get a line"
    },
    {
     "name": "order",
     "title": "Rank order",
     "type": "CHOICE",
     "description": "Use Lowest first for measures like delivery time or cost"
    },
    {
     "name": "highlight",
     "title": "Highlight",
     "type": "TEXT",
     "description": "Optional item to emphasise; other lines are muted"
    },
    {
     "name": "showValues",
     "title": "Show rank numbers",
     "type": "TOGGLE",
     "description": "Write the rank inside each point"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view ranks the items within each period itself, where the core **Line** view needs rank calculated in the workflow first, and draws the crossings as a league table.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Line",
     "page": null,
     "note": "A line per item over time; showing rank needs it calculated in the workflow first."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "barchartrace",
     "name": "Bar Chart Race",
     "page": "https://visokio.github.io/omniscope-custom-views/barchartrace/index.html",
     "note": "Rankings over time, animated as bars."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "slopechart",
     "name": "Slope Chart",
     "page": "https://visokio.github.io/omniscope-custom-views/slopechart/index.html",
     "note": "Change between two periods only, as values, shares or ranks."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/bumpchart/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/bumpchart",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/bumpchart/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/bumpchart/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/bumpchart/sample-data/sales.csv"
    ]
   }
  },
  {
   "id": "calendar",
   "name": "Calendar",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "A year at a glance: every day coloured by a measure, for spotting weekly rhythms, seasons and one-off peaks.",
   "tags": [
    "custom",
    "table",
    "time"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "date",
     "title": "Date",
     "type": "FIELD",
     "description": "The date of each record. The view groups the records by day"
    },
    {
     "name": "value",
     "title": "Colour",
     "type": "MEASURE",
     "description": "The value that colours each day, for example Record count or the sum of Sales. Lighter is lower, darker is higher"
    }
   ],
   "options": [],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "The core **Line** and **Bar** views show a daily measure as a trend. This view lays every day of every year out as a calendar, so the weekday and the time of year are read together and closures stand out.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "weeklypattern",
     "name": "Weekly Pattern",
     "page": "https://visokio.github.io/omniscope-custom-views/weeklypattern/index.html",
     "note": "Averages by weekday and hour, built from timestamps, rather than every day of the year."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "yearonyear",
     "name": "Year on Year",
     "page": "https://visokio.github.io/omniscope-custom-views/yearonyear/index.html",
     "note": "This year against last year, by month, quarter, week or day."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/calendar/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/calendar",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/calendar/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/calendar/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/calendar/sample-data/visits.csv"
    ]
   }
  },
  {
   "id": "cohortretention",
   "name": "Cohort Retention",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "Find out whether the customers you win this month are worth more than the ones you won last year. Point it at raw orders or logins; the cohorts, retention and lifetime value are worked out for you.",
   "tags": [
    "custom",
    "cohort",
    "retention",
    "churn",
    "customer",
    "heatmap",
    "subscription",
    "lifetime value",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "customer",
     "title": "Customer",
     "type": "FIELD",
     "description": "Field identifying each customer, user or account"
    },
    {
     "name": "date",
     "title": "Activity date",
     "type": "FIELD",
     "description": "Date of each order, visit, login or payment. A customer's cohort is the period of their first activity."
    },
    {
     "name": "value",
     "title": "Value",
     "type": "FIELD",
     "description": "Optional amount per row (e.g. Order value) for the revenue metrics"
    }
   ],
   "options": [
    {
     "name": "unit",
     "title": "Period",
     "type": "CHOICE",
     "description": "Size of each cohort and of each step after acquisition"
    },
    {
     "name": "metric",
     "title": "Show",
     "type": "CHOICE",
     "description": "What each cell shows. The revenue metrics need a Value field."
    },
    {
     "name": "maxPeriods",
     "title": "Periods after acquisition",
     "type": "NUMBER",
     "description": "Number of columns after the acquisition period"
    },
    {
     "name": "showAverage",
     "title": "Show average row",
     "type": "TOGGLE",
     "description": "Add a row with the average across cohorts (weighted by cohort size)"
    },
    {
     "name": "showCurves",
     "title": "Show retention curves",
     "type": "TOGGLE",
     "description": "Draw each cohort as a line beside the table, so cohorts can be compared"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view computes cohort retention in a report from raw activity data, laid out as the familiar triangle.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pivot",
     "page": null,
     "note": "Can tabulate customers by cohort and period; this view computes retention against each cohort's starting size and colours it as a triangle."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Cohort-Retention",
     "name": "Cohort Retention",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Cohort-Retention/index.html",
     "note": "Builds the same cohort matrix in the workflow, plus a table of each customer's cohort and last active period. Use it when those are needed as data; use this view to explore retention in a report."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/cohortretention/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/cohortretention",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/cohortretention/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/cohortretention/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/cohortretention/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "concentration",
   "name": "Concentration",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "How much depends on how few? A Lorenz curve and the standard concentration measures for any total, with the largest items one click away.",
   "tags": [
    "custom",
    "lorenz curve",
    "gini",
    "concentration",
    "pareto",
    "hhi",
    "inequality",
    "dependency",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "item",
     "title": "Items",
     "type": "GROUPING",
     "description": "What the total is spread over, e.g. Customer, Product, Supplier"
    },
    {
     "name": "value",
     "title": "Measure",
     "type": "MEASURE",
     "description": "e.g. sum of Revenue (negative values are left out)"
    },
    {
     "name": "compare",
     "title": "Compare by",
     "type": "GROUPING",
     "description": "Optional: one curve per group, e.g. Segment (up to 8)"
    }
   ],
   "options": [],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Pareto** view ranks items with a cumulative line. This view adds the standard measures for comparing concentration between groups.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pareto",
     "page": null,
     "note": "Ranked bars with a cumulative line, without the Lorenz curve, Gini or HHI."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Concentration-Measures",
     "name": "Concentration Measures",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Concentration-Measures/index.html",
     "note": "Calculates the same measures in the workflow, per group, with HHI bands, CR4 and the equivalent number of equal-sized entities. Use it to keep the figures as a table; use this view to compare curves and select items."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "abcxyz",
     "name": "ABC-XYZ Analysis",
     "page": "https://visokio.github.io/omniscope-custom-views/abcxyz/index.html",
     "note": "Classes items by share of value and demand variability, for stock policy."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/concentration/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/concentration",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/concentration/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/concentration/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/concentration/sample-data/customers.csv"
    ]
   }
  },
  {
   "id": "correlationmatrix",
   "name": "Correlation Matrix",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "Which of your measures move together? See every relationship at once, then click into any pair to look at the records behind it.",
   "tags": [
    "custom",
    "correlation",
    "matrix",
    "heatmap",
    "pearson",
    "spearman",
    "statistics",
    "drivers",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "fields",
     "title": "Numeric fields",
     "type": "FIELD",
     "description": "Two or more numeric fields to correlate"
    }
   ],
   "options": [
    {
     "name": "method",
     "title": "Method",
     "type": "CHOICE",
     "description": "Pearson measures straight-line relationships; Spearman measures any steadily rising or falling relationship and resists outliers"
    },
    {
     "name": "order",
     "title": "Order",
     "type": "CHOICE",
     "description": "Group related fields puts strongly correlated fields next to each other"
    },
    {
     "name": "triangle",
     "title": "Show",
     "type": "CHOICE",
     "description": "The matrix is symmetrical; the lower triangle avoids repetition"
    },
    {
     "name": "showValues",
     "title": "Show values",
     "type": "TOGGLE",
     "description": "Write the coefficient in each cell"
    },
    {
     "name": "maxRows",
     "title": "Rows used",
     "type": "NUMBER",
     "description": "Maximum number of records fetched for the calculation (default 20,000)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view shows every pair of fields as a heatmap with related fields grouped, and opens any pair as a scatter to check for outliers and curves.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Correlation-Matrix",
     "name": "Correlation Matrix",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Correlation-Matrix/index.html",
     "note": "Calculates the same correlations in the workflow, with p-values, per group or against one target, ranked by strength. Use it when significance or the pairs as a table matter; use this view to explore and drill into pairs."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Scatter",
     "page": null,
     "note": "One pair of fields at a time."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Parallel Coordinates",
     "page": null,
     "note": "Many numeric fields at once, record by record."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Covariance Correlation",
     "page": null,
     "note": "A covariance or correlation matrix as data in the workflow."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/correlationmatrix/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/correlationmatrix",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/correlationmatrix/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/correlationmatrix/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/correlationmatrix/sample-data/stores.csv"
    ]
   }
  },
  {
   "id": "customhtml",
   "name": "Custom HTML",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "Your own HTML in a report: an embedded widget, formatted notes, or HTML cards held in the data that follow the filters.",
   "tags": [
    "HTML",
    "web",
    "widget",
    "content"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "measures",
     "title": "HTML value",
     "type": "MEASURE",
     "description": "The field holding HTML, with a function that gives one value: Singleton (empty unless all records agree), Mode, Min or Max"
    },
    {
     "name": "msplit",
     "title": "One block per",
     "type": "GROUPING",
     "description": "Optional: one block of HTML per value of this field, one under the other"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "Optional: one view per value, side by side"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "Optional: one view per value, one above the other"
    }
   ],
   "options": [
    {
     "name": "aStaticHTML",
     "title": "Static HTML",
     "type": "TEXT"
    },
    {
     "name": "dynamicHTML",
     "title": "Show HTML from the data",
     "type": "TOGGLE"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "Use the core **Content** view for formatted and data-driven text; this view is for content that already exists as HTML.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Content",
     "page": null,
     "note": "Writes formatted text, links, images and formula-driven values without any HTML. Use this view when the content is already HTML: an embed snippet, or HTML cards stored in the data."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "web",
     "name": "Web View",
     "page": "https://visokio.github.io/omniscope-custom-views/web/index.html",
     "note": "Shows a whole web page, from an address in the data."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/Markdown-to-HTML",
     "name": "Markdown to HTML",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/Markdown-to-HTML/index.html",
     "note": "Converts Markdown text in a field to HTML, for this view to show formatted."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/customhtml/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/customhtml",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/customhtml/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/customhtml/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/customhtml/sample-data/products.csv"
    ]
   }
  },
  {
   "id": "customviewdemo",
   "name": "Custom View Demo",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "A bar chart in under 200 commented lines: the worked example to read before writing your own custom view.",
   "tags": [
    "custom",
    "demo",
    "highcharts"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "measures",
     "title": "Measure",
     "type": "MEASURE",
     "description": "The height of each bar, for example the sum of Sales"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "Optional: one chart per value, side by side (Omniscope draws the panes)"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "Optional: one chart per value, one above the other (Omniscope draws the panes)"
    },
    {
     "name": "split",
     "title": "Split",
     "type": "GROUPING",
     "description": "One bar per value of this text field, for example Product"
    }
   ],
   "options": [],
   "outputs": [],
   "libraries": [
    "highcharts 13.1.1"
   ],
   "relatedSummary": "The core **Bar** view is the one to use for bar charts. This view is a teaching example: its code is commented step by step, showing options, its own query, a charting library and selections.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Bar",
     "page": null,
     "note": "For a bar chart in a report, use the built-in Bar view. This view is a commented example of how to write one."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "kpi",
     "name": "KPI (custom view demo)",
     "page": "https://visokio.github.io/omniscope-custom-views/kpi/index.html",
     "note": "The smallest worked example, using Omniscope's automatic query."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/customviewdemo/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/customviewdemo",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/customviewdemo/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/customviewdemo/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/customviewdemo/sample-data/sales.csv"
    ]
   }
  },
  {
   "id": "decomposition",
   "name": "Seasonal Decomposition",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Is it growth, or is it just the season? Split any time series into trend, seasonal pattern and what is left over, and find the periods that were genuinely unusual.",
   "tags": [
    "custom",
    "decomposition",
    "seasonality",
    "trend",
    "anomaly",
    "time series",
    "residual",
    "outliers",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "date",
     "title": "Dated by",
     "type": "FIELD",
     "description": "The date of each record"
    },
    {
     "name": "value",
     "title": "Measure",
     "type": "MEASURE",
     "description": "What to decompose per period, e.g. sum of Sessions (default: number of records)"
    }
   ],
   "options": [
    {
     "name": "period",
     "title": "Period",
     "type": "CHOICE",
     "description": "Size of each period (default week)"
    },
    {
     "name": "seasonLength",
     "title": "Season length",
     "type": "NUMBER",
     "description": "Periods in one seasonal cycle (default 52 weeks, 12 months, 7 days or 4 quarters)"
    },
    {
     "name": "model",
     "title": "Season",
     "type": "CHOICE",
     "description": "How the seasonal pattern combines with the trend"
    },
    {
     "name": "threshold",
     "title": "Unusual beyond",
     "type": "NUMBER",
     "description": "Flag periods whose residual is more than this many robust standard deviations from typical (default 3)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Timeseries** view shows a series and **Regression** a trend line, but neither separates out the seasonal pattern. This view splits one series into trend, season and residual and flags the periods that were unusual once the season is allowed for.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Seasonal-Decomposition",
     "name": "Seasonal Decomposition",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Seasonal-Decomposition/index.html",
     "note": "Decomposes many series at once in the workflow and outputs the components, seasonally adjusted values and seasonal indices. Use it when those are needed as data; use this view to inspect one series and its unusual periods."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Timeseries",
     "page": null,
     "note": "The series itself."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Regression",
     "page": null,
     "note": "A trend line."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "forecast",
     "name": "Forecast",
     "page": "https://visokio.github.io/omniscope-custom-views/forecast/index.html",
     "note": "Fits a forecast with ranges to the same kind of series."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/decomposition/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/decomposition",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/decomposition/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/decomposition/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/decomposition/sample-data/sessions.csv"
    ]
   }
  },
  {
   "id": "decomptree",
   "name": "Decomposition Tree",
   "category": "Network",
   "categories": [
    "Network"
   ],
   "subcategory": null,
   "description": "Ask \"where does this number come from?\" and answer it in clicks: split any total by any field, in any order, and let the view find the split that matters most.",
   "tags": [
    "custom",
    "decomposition",
    "tree",
    "drill down",
    "root cause",
    "variance",
    "breakdown",
    "explain",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "measure",
     "title": "Analyse",
     "type": "MEASURE",
     "description": "The value to break down, e.g. sum of Revenue, count of Defects, mean of Delivery days"
    },
    {
     "name": "dimensions",
     "title": "Explain by",
     "type": "FIELD",
     "description": "Fields the viewer can split by, in any order: Region, Product, Channel, Customer type..."
    }
   ],
   "options": [
    {
     "name": "maxBars",
     "title": "Bars per level",
     "type": "NUMBER",
     "description": "How many categories to show in each level; the rest are summarised as Other for additive measures"
    },
    {
     "name": "sortOrder",
     "title": "Sort",
     "type": "CHOICE",
     "description": "Order of bars within each level"
    },
    {
     "name": "autoSplits",
     "title": "Offer automatic splits",
     "type": "TOGGLE",
     "description": "Add 'Highest value' and 'Lowest value' to the split menu: the view tries every remaining field and picks the one with the most extreme category"
    },
    {
     "name": "showPercent",
     "title": "Show share of parent",
     "type": "TOGGLE",
     "description": "Show each bar's share of its parent (sum and count measures only)"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "Unlike the core **Tree** and **Grouped Tree** views, this is the root-cause drill familiar from other BI tools, with the levels chosen as the viewer goes.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Tree",
     "page": null,
     "note": "Draws a hierarchy whose levels are set in advance; here the viewer picks the next field at each level, and automatic splits find the largest contributor."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Grouped Tree",
     "page": null,
     "note": "Also breaks a measure down through levels of grouping, with the levels chosen by the report author."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Sunburst",
     "page": null,
     "note": "Hierarchical part-to-whole as rings."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/decomptree/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/decomptree",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/decomptree/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/decomptree/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/decomptree/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "densityscatter",
   "name": "Density Scatter",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "A scatter plot that stays readable at a million rows: the server bins the points, the view shows where they really are, and a box selects them.",
   "tags": [
    "custom",
    "density",
    "heatmap",
    "scatter",
    "hexbin",
    "2d histogram",
    "big data",
    "distribution",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "x",
     "title": "X axis",
     "type": "FIELD",
     "description": "Numeric field across, e.g. Distance (km)"
    },
    {
     "name": "y",
     "title": "Y axis",
     "type": "FIELD",
     "description": "Numeric field up, e.g. Delivery time (minutes)"
    },
    {
     "name": "value",
     "title": "Colour by mean of",
     "type": "FIELD",
     "description": "Optional numeric field: each cell is coloured by its average, e.g. a 1/0 Late flag gives the late rate"
    }
   ],
   "options": [
    {
     "name": "bins",
     "title": "Grid size",
     "type": "NUMBER",
     "description": "Number of cells across each axis before rounding to tidy widths (default 80)"
    },
    {
     "name": "logScale",
     "title": "Log colour scale for counts",
     "type": "TOGGLE",
     "description": "Show sparse areas as well as dense ones"
    },
    {
     "name": "trim",
     "title": "Trim extreme values",
     "type": "TOGGLE",
     "description": "Set the axis ranges from the quartiles so outliers do not squash the chart"
    },
    {
     "name": "marginals",
     "title": "Show marginal histograms",
     "type": "TOGGLE",
     "description": "Histograms of X and Y along the axes"
    },
    {
     "name": "minCount",
     "title": "Minimum records per cell",
     "type": "NUMBER",
     "description": "Hide cells with fewer records (useful when colouring by a mean; default 1)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view exists for hundreds of thousands to millions of records, showing their density, or the average of a third field, where a normal scatter becomes a slow, solid blot.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Scatter",
     "page": null,
     "note": "The same chart, and the right choice for ordinary volumes; this view bins on the server so hundreds of thousands to millions of points stay readable."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/densityscatter/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/densityscatter",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/densityscatter/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/densityscatter/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/densityscatter/sample-data/deliveries.csv"
    ]
   }
  },
  {
   "id": "distribution",
   "name": "Distribution",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "Averages hide the story. See the whole shape of any number, with the median, percentiles, tail and outliers spelled out.",
   "tags": [
    "custom",
    "histogram",
    "distribution",
    "percentiles",
    "outliers",
    "statistics",
    "spread",
    "skew",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "value",
     "title": "Values",
     "type": "FIELD",
     "description": "Any number, e.g. Hours to deliver, Order value, Age"
    },
    {
     "name": "group",
     "title": "Compare by",
     "type": "FIELD",
     "description": "Optional: one outline per group, e.g. Carrier (up to 6)"
    }
   ],
   "options": [
    {
     "name": "bins",
     "title": "Bars",
     "type": "NUMBER",
     "description": "Approximate number of bars (default 40)"
    },
    {
     "name": "scale",
     "title": "Height",
     "type": "CHOICE",
     "description": "Shares make groups of different sizes comparable"
    },
    {
     "name": "clip",
     "title": "Trim the far tail",
     "type": "TOGGLE",
     "description": "Do not draw values beyond the upper outlier fence, so the main shape is visible (statistics still use every value)"
    },
    {
     "name": "maxRows",
     "title": "Values used",
     "type": "NUMBER",
     "description": "Maximum records fetched (default 500,000)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view draws the full histogram with the percentiles and outliers written out, for large datasets and for comparing groups.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Box Plot",
     "page": null,
     "note": "The same distribution as a five-number summary."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "beeswarm",
     "name": "Beeswarm",
     "page": "https://visokio.github.io/omniscope-custom-views/beeswarm/index.html",
     "note": "The distribution as individual dots, one per item, up to 1,000."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Histogram-Distribution",
     "name": "Histogram and Distribution",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Histogram-Distribution/index.html",
     "note": "Bins the values and calculates the same statistics in the workflow, with bins shared across groups. Use it when the histogram or the statistics are needed as tables; use this view to look at the shape."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Bar",
     "page": null,
     "note": "A histogram from a binned field."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "ridgeline",
     "name": "Ridgeline",
     "page": "https://visokio.github.io/omniscope-custom-views/ridgeline/index.html",
     "note": "Smoothed distribution shapes for dozens of categories, stacked."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/distribution/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/distribution",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/distribution/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/distribution/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/distribution/sample-data/deliveries.csv"
    ]
   }
  },
  {
   "id": "eventfunnel",
   "name": "Event Funnel",
   "category": "Diagram",
   "categories": [
    "Diagram"
   ],
   "subcategory": null,
   "description": "Where do people drop out? Conversion funnels from your raw event data, with drop-off, time between steps and comparisons by channel or device, in an Omniscope report.",
   "tags": [
    "custom",
    "funnel",
    "conversion",
    "event log",
    "product analytics",
    "drop-off",
    "journey",
    "ecommerce",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "user",
     "title": "Users",
     "type": "FIELD",
     "description": "Who did it: visitor, customer, account or session ID"
    },
    {
     "name": "event",
     "title": "Events",
     "type": "FIELD",
     "description": "What happened, e.g. Viewed product, Added to basket, Purchased"
    },
    {
     "name": "time",
     "title": "Ordered by",
     "type": "FIELD",
     "description": "When it happened"
    },
    {
     "name": "group",
     "title": "Compare by",
     "type": "FIELD",
     "description": "Optional: one funnel per group, e.g. Channel or Device (the value on each user's first event)"
    }
   ],
   "options": [
    {
     "name": "steps",
     "title": "Funnel steps",
     "type": "TEXT",
     "description": "The events of the funnel in order, separated by commas (blank: the most common events)"
    },
    {
     "name": "window",
     "title": "Within days",
     "type": "NUMBER",
     "description": "Optional: count a step only if it happens within this many days of the first step"
    },
    {
     "name": "combine",
     "title": "Show one funnel",
     "type": "TOGGLE",
     "description": "With Compare by set, show the combined funnel and keep the groups in the panel"
    },
    {
     "name": "maxEvents",
     "title": "Events used",
     "type": "NUMBER",
     "description": "Maximum events fetched (default 500,000)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view computes a funnel correctly from a raw event log, following each user through the steps in order within an optional time window.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Funnel",
     "page": null,
     "note": "The same funnel chart from step totals; this view computes ordered conversion per user from raw events. If step totals already exist, use Funnel."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Funnel-Analysis",
     "name": "Funnel Analysis",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Funnel-Analysis/index.html",
     "note": "Builds the same funnel in the workflow, plus one row per user with the furthest step reached and the time to convert, for remarketing lists. Use it for that table; use this view to explore and select users in a report."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "processmap",
     "name": "Process Map",
     "page": "https://visokio.github.io/omniscope-custom-views/processmap/index.html",
     "note": "Every path cases take through the steps, with rework loops and variants."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/eventfunnel/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/eventfunnel",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/eventfunnel/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/eventfunnel/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/eventfunnel/sample-data/events.csv"
    ]
   }
  },
  {
   "id": "forcecoordinategraph",
   "name": "Force Coordinate Graph",
   "category": "Network",
   "categories": [
    "Network"
   ],
   "subcategory": null,
   "description": "A network kept where your data puts it. Nodes at their own coordinates, links bundled into the flows they make.",
   "tags": [
    "custom",
    "circle",
    "dot",
    "jitter",
    "coordinate",
    "graph",
    "diagram",
    "edge",
    "bundle",
    "force",
    "network",
    "structure"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "colour",
     "title": "Colour",
     "type": "MEASURE",
     "description": "Colours the nodes and their outgoing links: a text field with the Singleton function (for example Region) gives category colours with a key; a number gives a colour scale"
    },
    {
     "name": "edgeWeight",
     "title": "Link weight",
     "type": "MEASURE",
     "description": "Thicker lines for heavier links, for example the sum of Shipments. When there are more links than Links shown, the heaviest are kept"
    },
    {
     "name": "imageURL",
     "title": "Image URL",
     "type": "MEASURE",
     "description": "Address of a picture drawn inside the node (a text field with the Singleton function). The browser showing the report must be able to load it"
    },
    {
     "name": "linkedNodeId",
     "title": "To node",
     "type": "GROUPING",
     "description": "The node at the other end of the record's link, a value of the From node field. Leave it empty for a record that only places a node"
    },
    {
     "name": "markerSize",
     "title": "Size",
     "type": "MEASURE",
     "description": "Sizes the nodes by area, for example the mean of Capacity. Empty: all nodes the same size"
    },
    {
     "name": "nodeId",
     "title": "From node",
     "type": "GROUPING",
     "description": "One node per value. Each record is a link from this node to To node; give every node at least one record, with To node empty if it has no links"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "One graph per value, side by side"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "One graph per value, one above the other"
    },
    {
     "name": "title",
     "title": "Tooltip",
     "type": "MEASURE",
     "description": "First line of a node's tooltip, for example a name field with the Singleton function. Empty: the From node value"
    },
    {
     "name": "x",
     "title": "X position",
     "type": "MEASURE",
     "description": "The node's horizontal coordinate, for example the mean of East (km). Worked out in advance: the view keeps nodes near these coordinates"
    },
    {
     "name": "y",
     "title": "Y position",
     "type": "MEASURE",
     "description": "The node's vertical coordinate, for example the mean of North (km)"
    }
   ],
   "options": [
    {
     "name": "preventNodeOverlap",
     "title": "Keep nodes apart",
     "type": "TOGGLE",
     "description": "Push nodes that would overlap a little away from their coordinates, so none hides another"
    },
    {
     "name": "bundleEdges",
     "title": "Bundle links",
     "type": "TOGGLE",
     "description": "Curve links that run in the same direction into shared bundles, so the main flows stand out. Off: straight lines"
    },
    {
     "name": "maxEdges",
     "title": "Links shown",
     "type": "NUMBER",
     "description": "The most links drawn (default 1000, at most 5000). Bundling many links takes a few seconds"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0",
    "cdn.jsdelivr.net/gh/upphiminn/d3.ForceBundle@467c068f237ca1436c0b4841d2b5d2a81c1c7f94/d3-ForceEdgeBundling.js"
   ],
   "relatedSummary": "The core **Network** view can also place nodes at X and Y values from the data, and suits most networks. This view is for dense networks at fixed positions, such as depots on a map, where bundling hundreds of crossing links into a few flows makes the pattern readable.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Network",
     "page": null,
     "note": "Can also place nodes at X and Y values from the data (its Manual layout). This view bundles links that run the same way into flows and pushes overlapping nodes apart."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "networkanalyser",
     "name": "Network Analyser",
     "page": "https://visokio.github.io/omniscope-custom-views/networkanalyser/index.html",
     "note": "A network in a free layout, with communities, centrality and shortest paths."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Network-Analysis/TSNE",
     "name": "TSNE",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Network-Analysis/TSNE/index.html",
     "note": "Places the nodes of a network on a 2-D map with t-SNE, giving positions this view can use."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/forcecoordinategraph/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/forcecoordinategraph",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/forcecoordinategraph/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/forcecoordinategraph/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/forcecoordinategraph/sample-data/routes.csv"
    ]
   }
  },
  {
   "id": "forecast",
   "name": "Forecast",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Where is this heading? A forecast for any measure in your data, with ranges, seasonality and a built-in check of how accurate it would have been, live in an Omniscope report.",
   "tags": [
    "custom",
    "forecast",
    "time series",
    "holt-winters",
    "exponential smoothing",
    "prediction",
    "seasonality",
    "planning",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "date",
     "title": "Dated by",
     "type": "FIELD",
     "description": "The date of each record, e.g. Order date, Month"
    },
    {
     "name": "value",
     "title": "Forecast",
     "type": "MEASURE",
     "description": "The measure to forecast per period, e.g. sum of Sales or record count"
    }
   ],
   "options": [
    {
     "name": "period",
     "title": "Period",
     "type": "CHOICE",
     "description": "Size of each period (default month); also sets the length of the season"
    },
    {
     "name": "horizon",
     "title": "Periods ahead",
     "type": "NUMBER",
     "description": "How far to forecast (default one season, e.g. 12 months)"
    },
    {
     "name": "model",
     "title": "Season",
     "type": "CHOICE",
     "description": "How the seasonal pattern behaves"
    },
    {
     "name": "seasonal",
     "title": "Seasonal",
     "type": "TOGGLE",
     "description": "Turn off for series without a repeating pattern"
    },
    {
     "name": "backtest",
     "title": "Show backtest",
     "type": "TOGGLE",
     "description": "Forecast the most recent periods from the history before them, to show how accurate the method is"
    },
    {
     "name": "historyShown",
     "title": "History shown",
     "type": "NUMBER",
     "description": "Periods of history drawn (0 or blank for all); the model always uses all history"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Time Series Forecast** block adds forecasts to the data in the workflow; this view fits a forecast in the report itself, re-fitted for any filtered slice, with ranges and a backtest.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Timeseries",
     "page": null,
     "note": "Shows the history; Omniscope's Time Series Forecast workflow block can add forecasts to the data."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Holt-Winters-Forecast",
     "name": "Holt-Winters Forecast",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Holt-Winters-Forecast/index.html",
     "note": "Fits Holt-Winters per series in the workflow, many series in one pass, with prediction intervals and a holdout check. Use it when the forecasts are needed as data; use this view for one series re-fitted as the report is filtered."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Area Range",
     "page": null,
     "note": "Bands around a line, for a forecast already calculated."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "decomposition",
     "name": "Seasonal Decomposition",
     "page": "https://visokio.github.io/omniscope-custom-views/decomposition/index.html",
     "note": "Splits the same kind of series into trend, season and residual, and flags unusual periods."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Time Series Forecast",
     "page": null,
     "note": "Forecasts in the workflow, with ARIMA settings, when the forecast is needed as data."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/forecast/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/forecast",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/forecast/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/forecast/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/forecast/sample-data/daily_visits.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/forecast/sample-data/sales_history.csv"
    ]
   }
  },
  {
   "id": "francechoropleth",
   "name": "France Choropleth",
   "category": "Map",
   "categories": [
    "Map"
   ],
   "subcategory": null,
   "description": "Every French department coloured by a figure from your data, overseas departments and Paris included, with a click to filter the report to one department.",
   "tags": [
    "custom",
    "map",
    "france"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "measures",
     "title": "Colour",
     "type": "MEASURE",
     "description": "The value that colours each department, for example the sum of Sales. Lighter is lower, darker is higher"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "Optional: one map per value, side by side"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "Optional: one map per value, one above the other"
    },
    {
     "name": "split",
     "title": "Department field",
     "type": "GROUPING",
     "description": "A field holding French department names (Ain, Côte-d'Or) or INSEE codes (01, 2A, 974); each value colours one department"
    }
   ],
   "options": [],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "For French departments this view is quicker than the core **Choropleth** view: the outlines are built in and loose names and codes match without a join.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Choropleth",
     "page": null,
     "note": "Colours regions on a map from a set of region shapes. This view has the French departments built in, with the overseas departments, an enlarged Paris inset and forgiving name matching."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "tilemap",
     "name": "Tile Map",
     "page": "https://visokio.github.io/omniscope-custom-views/tilemap/index.html",
     "note": "Every region as a same-sized tile, for US states, UK regions or a custom grid."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/francechoropleth/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/francechoropleth",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/francechoropleth/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/francechoropleth/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/francechoropleth/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "globeflows",
   "name": "Globe Flows",
   "category": "Map",
   "categories": [
    "Map"
   ],
   "subcategory": null,
   "description": "Put your supply chain, trade lanes or payment corridors on a living globe: every route drawn to scale, coloured by region, and one click from the records behind it.",
   "tags": [
    "custom",
    "globe",
    "3d",
    "three.js",
    "flows",
    "map",
    "origin destination",
    "trade",
    "logistics",
    "arcs",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "origin",
     "title": "Origin",
     "type": "GROUPING",
     "description": "Name of where each flow starts, e.g. Origin port, Sender country"
    },
    {
     "name": "destination",
     "title": "Destination",
     "type": "GROUPING",
     "description": "Name of where each flow ends"
    },
    {
     "name": "originLat",
     "title": "Origin latitude",
     "type": "MEASURE",
     "description": "Latitude of the origin in decimal degrees (mean is used if it varies)"
    },
    {
     "name": "originLon",
     "title": "Origin longitude",
     "type": "MEASURE",
     "description": "Longitude of the origin in decimal degrees"
    },
    {
     "name": "destLat",
     "title": "Destination latitude",
     "type": "MEASURE",
     "description": "Latitude of the destination in decimal degrees"
    },
    {
     "name": "destLon",
     "title": "Destination longitude",
     "type": "MEASURE",
     "description": "Longitude of the destination in decimal degrees"
    },
    {
     "name": "value",
     "title": "Flow size",
     "type": "MEASURE",
     "description": "Optional size of each flow, e.g. sum of Containers or Amount; without it each pair counts once"
    },
    {
     "name": "colour",
     "title": "Colour by field",
     "type": "GROUPING",
     "description": "Optional category to colour flows by, e.g. Origin region or Product. Overrides Colour flows by. Up to eight colours; the rest are grey."
    }
   ],
   "options": [
    {
     "name": "colourBy",
     "title": "Colour flows by",
     "type": "CHOICE",
     "description": "The eight largest origins (or destinations) get their own colour"
    },
    {
     "name": "maxFlows",
     "title": "Flows to draw",
     "type": "NUMBER",
     "description": "Draw the largest N flows (default 400)"
    },
    {
     "name": "animate",
     "title": "Animate flows",
     "type": "TOGGLE",
     "description": "Pulses travel along the largest flows from origin to destination"
    },
    {
     "name": "autoRotate",
     "title": "Auto rotate",
     "type": "TOGGLE",
     "description": "Slowly spin the globe"
    },
    {
     "name": "labels",
     "title": "Label places",
     "type": "NUMBER",
     "description": "Label the N places with the most flow (default 12)"
    }
   ],
   "outputs": [],
   "libraries": [
    "three 0.147.0",
    "d3 7.9.0",
    "topojson-client 3.1.0"
   ],
   "relatedSummary": "The core **Map** view shows geographic data on a flat map. This view draws origin-to-destination flows as arcs on a 3D globe, sized by volume, for presenting a network of routes that viewers can turn and zoom.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Map",
     "page": null,
     "note": "Geographic data on a flat map."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "orbitaltransactionflow",
     "name": "Orbital Transaction Flow",
     "page": "https://visokio.github.io/omniscope-custom-views/orbitaltransactionflow/index.html",
     "note": "Flows between parties replayed over time around a central hub, without geography."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Point-To-Point-Distance",
     "name": "Point-to-Point Distance",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Point-To-Point-Distance/index.html",
     "note": "Great-circle distance and bearing for each origin and destination pair."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Geocode",
     "page": null,
     "note": "Adds the latitude and longitude this view needs when the data only has place names."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/globeflows/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/globeflows",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/globeflows/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/globeflows/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/globeflows/sample-data/routes.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/globeflows/sample-data/shipments.csv"
    ]
   }
  },
  {
   "id": "indexheatmap",
   "name": "Index Heatmap",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "Who over-indexes? A cross-tab that shows at a glance which combinations are more or less common than average, and which differences are real.",
   "tags": [
    "custom",
    "index",
    "cross-tab",
    "heatmap",
    "over-index",
    "market research",
    "residuals",
    "profiling",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "rows",
     "title": "Rows",
     "type": "GROUPING",
     "description": "e.g. Category"
    },
    {
     "name": "cols",
     "title": "Columns",
     "type": "GROUPING",
     "description": "e.g. Age band"
    },
    {
     "name": "value",
     "title": "Measure",
     "type": "MEASURE",
     "description": "Record count for a classic cross-tab (with significance), or a sum such as Spend"
    }
   ],
   "options": [
    {
     "name": "show",
     "title": "Show",
     "type": "CHOICE",
     "description": "What each cell shows; colour is always the index"
    },
    {
     "name": "sort",
     "title": "Sort",
     "type": "CHOICE"
    },
    {
     "name": "marks",
     "title": "Mark significant",
     "type": "TOGGLE",
     "description": "With counts, mark cells that differ from average by more than chance (adjusted residual beyond 1.96)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Pivot** view shows the same cross-tab of values; index scores against expectation and significance marks are what turn it into a profiling tool.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pivot",
     "page": null,
     "note": "The same cross-tab, without index scores or significance."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Contingency-Table",
     "name": "Contingency Table and Chi-square",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Contingency-Table/index.html",
     "note": "Cross-tabulates the same two fields in the workflow, with expected counts, adjusted residuals and a chi-square test with Cramer's V. Use it when the test result matters or the cells are needed as data; use this view to read the profile."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "marketbasket",
     "name": "Market Basket",
     "page": "https://visokio.github.io/omniscope-custom-views/marketbasket/index.html",
     "note": "Lift between items bought together, from order lines."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/indexheatmap/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/indexheatmap",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/indexheatmap/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/indexheatmap/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/indexheatmap/sample-data/purchases.csv"
    ]
   }
  },
  {
   "id": "jsontree",
   "name": "JSON Tree",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "JSON stored in a field, opened up as a tree you can click through, one node per record.",
   "tags": [
    "custom",
    "tree",
    "json"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "json",
     "title": "JSON field",
     "type": "FIELD",
     "description": "A text field whose values are JSON. Each record is one node of the tree"
    },
    {
     "name": "label",
     "title": "Record label",
     "type": "FIELD",
     "description": "Optional: a field that names each record's node, for example an ID. Clicking a record's node then selects the records with that label"
    }
   ],
   "options": [],
   "outputs": [],
   "libraries": [
    "jstree 3.3.17",
    "jquery 3.7.1"
   ],
   "relatedSummary": "This view is for looking inside JSON held in a field, to see its shape before deciding what to extract; the core **Table** view only shows it as a line of text.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/JSON/Normalise",
     "name": "JSON Normalise",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/JSON/Normalise/index.html",
     "note": "Flattens JSON text into records and fields once you know what you need."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/JSON/Expand_Fields",
     "name": "JSON Expand fields",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/JSON/Expand_Fields/index.html",
     "note": "Turns the top-level keys of a JSON object into fields."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Parse text",
     "page": null,
     "note": "Parses JSON or XML text into columns."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/jsontree/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/jsontree",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/jsontree/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/jsontree/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/jsontree/sample-data/orders_api.csv"
    ]
   }
  },
  {
   "id": "kpi",
   "name": "KPI (custom view demo)",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "One number, one title. The headline figure of a dashboard, recalculated as the viewer filters the report.",
   "tags": [
    "custom",
    "key"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "measure",
     "title": "Measure",
     "type": "MEASURE",
     "description": "The value to show, worked out over all the records in the view, for example the sum of Sales"
    }
   ],
   "options": [
    {
     "name": "text",
     "title": "Title text",
     "type": "TEXT",
     "description": "Title shown above the value. If empty, the measure's name is shown"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "For headline figures in a report, use the core **KPI** or **Content** view. This view is kept as the smallest example in the repository, one HTML file with no libraries, as a starting point for writing a custom view.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "KPI",
     "page": null,
     "note": "The built-in view for headline figures in a report. This view is mainly a minimal, readable example for writing your own custom view."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Content",
     "page": null,
     "note": "Builds headline figures and sentences from formulas, with formula-driven styling."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "customviewdemo",
     "name": "Custom View Demo",
     "page": "https://visokio.github.io/omniscope-custom-views/customviewdemo/index.html",
     "note": "The other worked example: a view that runs its own query and sends selections back."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/kpi/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/kpi",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/kpi/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/kpi/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/kpi/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "lambdaworkflowexecution",
   "name": "Lambda Workflow Execution",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "Run the workflow with your own values, in a copy of the project, without changing the project.",
   "tags": [
    "custom",
    "lambda",
    "parameter",
    "param",
    "workflow",
    "job",
    "execute",
    "execution",
    "block",
    "api"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [],
   "options": [
    {
     "name": "block",
     "title": "Blocks to execute",
     "type": "TEXT",
     "description": "Names of the workflow blocks to execute, separated by commas, e.g. Load orders, Report. Leave empty to execute the whole workflow."
    },
    {
     "name": "buttonText",
     "title": "Button text",
     "type": "TEXT",
     "description": "Text on the button. If empty: Execute"
    },
    {
     "name": "deleteExecutionOnFinish",
     "title": "Delete the copy when finished",
     "type": "TOGGLE",
     "description": "Delete the copy of the project, and its execution data, when the execution ends. Off: a link to the copy is shown."
    },
    {
     "name": "paramNames",
     "title": "Parameters to show",
     "type": "TEXT",
     "description": "Names of the project parameters to show, in this order, separated by commas. Leave empty to show them all."
    },
    {
     "name": "refreshThisReportOnFinish",
     "title": "Refresh this report when finished",
     "type": "TOGGLE",
     "description": "When the execution has finished, execute this report's block (from source) so the report shows what the execution wrote."
    },
    {
     "name": "setParametersUsingVariables",
     "title": "Take values from report variables",
     "type": "TOGGLE",
     "description": "Set each parameter from the report variable with the same name, instead of from inputs the viewer types in. Parameters with no such variable are not set."
    },
    {
     "name": "showJobState",
     "title": "Show job state",
     "type": "TOGGLE",
     "description": "Show the execution's progress (queued, running, finished) under the button. Errors are always shown."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "Of the execution views, this is the one for several viewers at once: each run happens in a new copy of the project, so typed values never overwrite each other or change the published report.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "setparamandexecute",
     "name": "Set Parameters and Execute",
     "page": "https://visokio.github.io/omniscope-custom-views/setparamandexecute/index.html",
     "note": "Changes the project's own parameters and executes the project itself. Use it when the published report should show the new values' results."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "workflowexecution",
     "name": "Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/workflowexecution/index.html",
     "note": "Executes the project itself, without parameter inputs."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "uploadandexecute",
     "name": "Upload and Execute",
     "page": "https://visokio.github.io/omniscope-custom-views/uploadandexecute/index.html",
     "note": "A lambda execution on a file the viewer uploads, rather than typed values."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/lambdaworkflowexecution/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/lambdaworkflowexecution",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/lambdaworkflowexecution/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/lambdaworkflowexecution/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/lambdaworkflowexecution/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "likert",
   "name": "Likert Survey",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "What do people really think? Survey results on a rating scale, centred on neutral, sorted by net score and split by any group, straight from the survey data in an Omniscope report.",
   "tags": [
    "custom",
    "likert",
    "survey",
    "diverging bar",
    "nps",
    "engagement",
    "feedback",
    "questionnaire",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "answer",
     "title": "Answers",
     "type": "FIELD",
     "description": "The rating given, e.g. Strongly disagree to Strongly agree, 1 to 5, or 0 to 10"
    },
    {
     "name": "question",
     "title": "Questions",
     "type": "FIELD",
     "description": "Optional: the question or statement each answer belongs to, when one column holds several questions"
    },
    {
     "name": "group",
     "title": "Compare by",
     "type": "FIELD",
     "description": "Optional: split each question by a group, e.g. Department or Region"
    }
   ],
   "options": [
    {
     "name": "order",
     "title": "Answer order",
     "type": "TEXT",
     "description": "Optional: the scale from most negative to most positive, separated by commas, when it is not recognised automatically"
    },
    {
     "name": "scale",
     "title": "Scale",
     "type": "CHOICE",
     "description": "Automatic treats 0 to 10 answers as Net Promoter Score"
    },
    {
     "name": "sort",
     "title": "Sort questions",
     "type": "CHOICE",
     "description": "Order of the questions"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Bar** and **Mirror Bar** views can show counts of answers, but not as the standard survey chart. This view draws that diverging chart from one row per answer.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Bar",
     "page": null,
     "note": "Stacked bars of answers, not centred on the neutral answer."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Mirror Bar",
     "page": null,
     "note": "Two-sided bars, without the scale order or the neutral centre."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Likert-Survey",
     "name": "Likert Survey Summary",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Likert-Survey/index.html",
     "note": "Summarises the same questions in the workflow (mean, top-2-box, net score) from a wide export with one column per statement, and outputs the long layout this view reads."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Net-Promoter-Score",
     "name": "Net Promoter Score",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Net-Promoter-Score/index.html",
     "note": "Net Promoter Score per group and period with margins of error and significance tests."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "De-pivot",
     "page": null,
     "note": "Turns a wide survey export, one column per question, into the long layout this view reads."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/likert/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/likert",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/likert/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/likert/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/likert/sample-data/enps.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/likert/sample-data/survey_responses.csv"
    ]
   }
  },
  {
   "id": "marimekko",
   "name": "Marimekko",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "The one-page market map: how big each segment is, who wins in each, and where your brand is strong or missing, in a single chart.",
   "tags": [
    "custom",
    "marimekko",
    "mekko",
    "market map",
    "share",
    "mosaic",
    "variable width",
    "competitor",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "columns",
     "title": "Columns",
     "type": "GROUPING",
     "description": "Category for the columns, e.g. Market segment or Region. Column width is its share of the total."
    },
    {
     "name": "stack",
     "title": "Stack",
     "type": "GROUPING",
     "description": "Category stacked within each column, e.g. Brand or Competitor. Height is its share of the column."
    },
    {
     "name": "value",
     "title": "Value",
     "type": "MEASURE",
     "description": "Measure for sizes, e.g. sum of Sales"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING"
    }
   ],
   "options": [
    {
     "name": "maxSeries",
     "title": "Stack categories",
     "type": "NUMBER",
     "description": "Show the largest N stack categories by total; the rest are combined into Other (default 6)"
    },
    {
     "name": "highlight",
     "title": "Highlight",
     "type": "TEXT",
     "description": "Optional stack category to emphasise, e.g. your own brand; the others are shown in muted colours"
    },
    {
     "name": "sortColumns",
     "title": "Sort columns",
     "type": "CHOICE",
     "description": "Column order"
    },
    {
     "name": "labels",
     "title": "Show segment labels",
     "type": "TOGGLE",
     "description": "Write the share inside segments that are big enough"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "A Marimekko makes each column's width its share of the total, so market size and share read from one chart.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Bar",
     "page": null,
     "note": "100% stacked bars show the mix within each segment, but not the segment sizes as widths."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Tile",
     "page": null,
     "note": "Rectangles sized by value."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/marimekko/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/marimekko",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/marimekko/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/marimekko/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/marimekko/sample-data/market.csv"
    ]
   }
  },
  {
   "id": "marketbasket",
   "name": "Market Basket",
   "category": "Table",
   "categories": [
    "Table",
    "Network"
   ],
   "subcategory": null,
   "description": "Find out what sells with what. Point it at your order lines and see which products are bought together, how strongly, and in which baskets, with rules your merchandising and marketing teams can act on.",
   "tags": [
    "custom",
    "market basket",
    "association rules",
    "affinity",
    "cross-sell",
    "basket analysis",
    "lift",
    "retail",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "basket",
     "title": "Baskets",
     "type": "FIELD",
     "description": "Identifier of each basket, e.g. Transaction ID, Order ID, Invoice number"
    },
    {
     "name": "item",
     "title": "Items",
     "type": "FIELD",
     "description": "What was bought, e.g. Product, SKU, Category"
    },
    {
     "name": "group",
     "title": "Item colour",
     "type": "FIELD",
     "description": "Optional: colour items by a category, e.g. Department"
    }
   ],
   "options": [
    {
     "name": "rank",
     "title": "Rank rules by",
     "type": "CHOICE",
     "description": "Order of the rules list"
    },
    {
     "name": "order",
     "title": "Order items",
     "type": "CHOICE",
     "description": "Clustering places items bought together next to each other"
    },
    {
     "name": "topItems",
     "title": "Items shown",
     "type": "NUMBER",
     "description": "Number of most frequent items in the matrix (default 25)"
    },
    {
     "name": "minSupport",
     "title": "Minimum support %",
     "type": "NUMBER",
     "description": "Pairs must appear in at least this percentage of baskets to count as a rule (default 0.5)"
    },
    {
     "name": "maxLines",
     "title": "Lines used",
     "type": "NUMBER",
     "description": "Maximum number of basket lines fetched (default 300,000)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "Use this view to explore which items are bought together, ranked as rules, and to select the baskets behind a pair.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Basket-Affinity",
     "name": "Basket Affinity Matrix",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Basket-Affinity/index.html",
     "note": "Measures the same pairs in the workflow, with Jaccard and each item's strongest partners. Use it to keep the pairs as a table; use this view to explore them and select baskets."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Chord",
     "page": null,
     "note": "Links between categories, once co-occurrence is calculated."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "indexheatmap",
     "name": "Index Heatmap",
     "page": "https://visokio.github.io/omniscope-custom-views/indexheatmap/index.html",
     "note": "Index scores for two categories of the same records, against what chance would give."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Product-Recommendations",
     "name": "Product Recommendations",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Product-Recommendations/index.html",
     "note": "Turns purchase history into recommendations per customer, with the product that prompted each."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Basket Analysis",
     "page": null,
     "note": "Association rules in the workflow, at item and item-group level."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/marketbasket/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/marketbasket",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/marketbasket/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/marketbasket/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/marketbasket/sample-data/baskets.csv"
    ]
   }
  },
  {
   "id": "mixpanel",
   "name": "Mixpanel tracker",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "Usage analytics for a report, in your own Mixpanel project: who opens it, which tabs they use and what they click.",
   "tags": [
    "mixpanel",
    "tracking",
    "usage",
    "analytics",
    "tool"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [],
   "options": [
    {
     "name": "api_host",
     "title": "API host",
     "type": "TEXT"
    },
    {
     "name": "token",
     "title": "Mixpanel project token",
     "type": "TEXT"
    },
    {
     "name": "trackClicks",
     "title": "Track clicks",
     "type": "TOGGLE"
    },
    {
     "name": "sendUser",
     "title": "Send user identity",
     "type": "TOGGLE"
    },
    {
     "name": "showNotice",
     "title": "Show notice",
     "type": "TOGGLE"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": null,
   "related": [],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/mixpanel/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/mixpanel",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/mixpanel/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/mixpanel/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/mixpanel/sample-data/report_usage.csv"
    ]
   }
  },
  {
   "id": "modelevaluation",
   "name": "Model Evaluation",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "See how good a model really is, and what any threshold means in practice: ROC, gains, distributions and the confusion matrix, all live, all linked to the records.",
   "tags": [
    "custom",
    "model",
    "machine learning",
    "roc",
    "auc",
    "lift",
    "gain",
    "confusion matrix",
    "classification",
    "prediction",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "actual",
     "title": "Actual outcome",
     "type": "FIELD",
     "description": "Field holding the true class, e.g. Churned (Yes/No), Defaulted (1/0), Fraud (True/False)"
    },
    {
     "name": "score",
     "title": "Predicted score",
     "type": "FIELD",
     "description": "The model's probability or score for the positive class, e.g. the output of the Prediction block"
    }
   ],
   "options": [
    {
     "name": "positive",
     "title": "Positive value",
     "type": "TEXT",
     "description": "Value of Actual outcome that counts as positive. Leave empty to detect it (1, Yes, True, or the rarer class)."
    },
    {
     "name": "threshold",
     "title": "Threshold",
     "type": "NUMBER",
     "description": "Starting decision threshold (default 0.5, or the middle of the score range); adjust it live with the slider in the view"
    },
    {
     "name": "bins",
     "title": "Score resolution",
     "type": "NUMBER",
     "description": "Number of score bins used for the curves (default 100)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view evaluates a two-class model that has already scored the records, whether in Omniscope or outside it: ROC, gains and a confusion matrix, all driven by one threshold.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Regression",
     "page": null,
     "note": "Fits models rather than evaluating a classifier."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Validation/Model-Validation",
     "name": "Model Validation",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Validation/Model-Validation/index.html",
     "note": "Confusion matrix with precision, recall and F1 for models that predict a category, including more than two classes."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Regression",
     "name": "Regression",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Regression/index.html",
     "note": "Fits a logistic regression and scores each row with a probability, ready to evaluate here."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Prediction",
     "page": null,
     "note": "Its scored output, with a likelihood for each target value, can be evaluated here."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/modelevaluation/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/modelevaluation",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/modelevaluation/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/modelevaluation/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/modelevaluation/sample-data/scores.csv"
    ]
   }
  },
  {
   "id": "motionbubbles",
   "name": "Motion Bubbles",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Watch your portfolio move. Every product, store or customer as a bubble, travelling through two dimensions over time, with trails that show where each one came from.",
   "tags": [
    "custom",
    "animation",
    "bubble",
    "scatter",
    "motion chart",
    "over time",
    "portfolio",
    "bcg",
    "storytelling",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "entity",
     "title": "Bubbles",
     "type": "GROUPING",
     "description": "One bubble per value, e.g. Product, Store, Country"
    },
    {
     "name": "time",
     "title": "Time",
     "type": "GROUPING",
     "description": "The animation frames, e.g. Quarter or Year (a date grouped by quarter works well)"
    },
    {
     "name": "x",
     "title": "X axis",
     "type": "MEASURE",
     "description": "Horizontal position, e.g. Relative market share"
    },
    {
     "name": "y",
     "title": "Y axis",
     "type": "MEASURE",
     "description": "Vertical position, e.g. Market growth"
    },
    {
     "name": "size",
     "title": "Size",
     "type": "MEASURE",
     "description": "Optional bubble area, e.g. sum of Revenue"
    },
    {
     "name": "colour",
     "title": "Colour by",
     "type": "GROUPING",
     "description": "Optional category, e.g. Business unit or Region (eight colours)"
    }
   ],
   "options": [
    {
     "name": "xLog",
     "title": "Log X axis",
     "type": "TOGGLE",
     "description": "Logarithmic horizontal scale (positive values only)"
    },
    {
     "name": "yLog",
     "title": "Log Y axis",
     "type": "TOGGLE",
     "description": "Logarithmic vertical scale (positive values only)"
    },
    {
     "name": "xRef",
     "title": "X reference line",
     "type": "NUMBER",
     "description": "Optional vertical line, e.g. 1 for relative share"
    },
    {
     "name": "yRef",
     "title": "Y reference line",
     "type": "NUMBER",
     "description": "Optional horizontal line, e.g. 10 for 10% growth"
    },
    {
     "name": "labels",
     "title": "Labels",
     "type": "NUMBER",
     "description": "Label the N largest bubbles (default 8)"
    },
    {
     "name": "trails",
     "title": "Trails for selected bubbles",
     "type": "TOGGLE",
     "description": "Draw the path of selected or hovered bubbles"
    },
    {
     "name": "duration",
     "title": "Seconds per period",
     "type": "NUMBER",
     "description": "Speed of the animation (default 1)"
    },
    {
     "name": "autoplay",
     "title": "Play automatically",
     "type": "TOGGLE",
     "description": "Start playing when the report opens"
    },
    {
     "name": "loop",
     "title": "Loop",
     "type": "TOGGLE",
     "description": "Start again after the last period"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Scatter** view shows the bubbles for one moment; this view animates them through time, with trails, a format for presentations where the movement is the story.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Scatter",
     "page": null,
     "note": "The same bubbles for one moment, without the animation over time."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "barchartrace",
     "name": "Bar Chart Race",
     "page": "https://visokio.github.io/omniscope-custom-views/barchartrace/index.html",
     "note": "Also plays through time, as a ranking of bars."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "quadrant",
     "name": "Quadrant Matrix",
     "page": "https://visokio.github.io/omniscope-custom-views/quadrant/index.html",
     "note": "A still two-by-two, with named quadrants and selection by quadrant."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "bubblechart",
     "name": "Bubble Chart",
     "page": "https://visokio.github.io/omniscope-custom-views/bubblechart/index.html",
     "note": "Bubbles sized by a measure and packed together, with no axes or time."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/motionbubbles/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/motionbubbles",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/motionbubbles/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/motionbubbles/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/motionbubbles/sample-data/portfolio.csv"
    ]
   }
  },
  {
   "id": "networkanalyser",
   "name": "Network Analyser",
   "category": "Network",
   "categories": [
    "Network"
   ],
   "subcategory": null,
   "description": "Turn any table of who-pays-whom, who-supplies-whom or who-talks-to-whom into a living network, with the communities, brokers and paths found for you.",
   "tags": [
    "custom",
    "network",
    "graph",
    "relationship",
    "community",
    "centrality",
    "fraud",
    "link analysis",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "source",
     "title": "From",
     "type": "GROUPING",
     "description": "Field holding one end of each link, e.g. Payer account, Sender, Supplier"
    },
    {
     "name": "target",
     "title": "To",
     "type": "GROUPING",
     "description": "Field holding the other end of each link, e.g. Payee account, Recipient, Customer"
    },
    {
     "name": "weight",
     "title": "Link weight",
     "type": "MEASURE",
     "description": "Optional strength of each link, e.g. sum of Amount or count of messages. Without it every pair counts once."
    }
   ],
   "options": [
    {
     "name": "sizeBy",
     "title": "Size nodes by",
     "type": "CHOICE",
     "description": "Centrality measure used for node size, the ranking list and labels"
    },
    {
     "name": "colourBy",
     "title": "Colour nodes by",
     "type": "CHOICE",
     "description": "Communities are detected in the browser with the Louvain method"
    },
    {
     "name": "directed",
     "title": "Directed links",
     "type": "TOGGLE",
     "description": "Treat From to To as a direction: draws arrows and uses direction for PageRank and paths"
    },
    {
     "name": "labels",
     "title": "Labels",
     "type": "CHOICE",
     "description": "Which node labels to draw"
    },
    {
     "name": "labelCount",
     "title": "Number of labels",
     "type": "NUMBER",
     "description": "How many of the most central nodes to label when Labels is Most central nodes"
    },
    {
     "name": "minWeight",
     "title": "Minimum link weight",
     "type": "NUMBER",
     "description": "Hide links weaker than this before analysing (0 keeps every link)"
    },
    {
     "name": "showPanel",
     "title": "Show analysis panel",
     "type": "TOGGLE",
     "description": "Side panel with network statistics, rankings, communities, search and path finder"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Network** and **Force Graph** views and the community **3D Force Graph** already draw networks; this view's reason is the analysis, computed in the report and usable as selections.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Network",
     "page": null,
     "note": "Draws the same node-link networks. This view adds communities, centrality, shortest paths and neighbourhood focus; for a picture of the network alone, use Network."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Force Graph",
     "page": null,
     "note": "A force-directed layout of the same links, without the network analytics."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "threeforcegraph",
     "name": "3D Force Graph",
     "page": "https://visokio.github.io/omniscope-custom-views/threeforcegraph/index.html",
     "note": "The same kind of network in 3D, which gives a dense graph more room, but without the analytics."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "forcecoordinategraph",
     "name": "Force Coordinate Graph",
     "page": "https://visokio.github.io/omniscope-custom-views/forcecoordinategraph/index.html",
     "note": "A network drawn at positions given in the data, with links bundled into flows."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Network-Analysis/Attribute-Analysis",
     "name": "Attribute Analysis",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Network-Analysis/Attribute-Analysis/index.html",
     "note": "Measures how much each category's connections are shared with each other category, giving category-to-category links."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Websites/Website-Analysis",
     "name": "Website Analysis",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Websites/Website-Analysis/index.html",
     "note": "Crawls a website and lists the links between its pages, a network this view can analyse."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Network Analysis",
     "page": null,
     "note": "Finds important nodes and clusters in the workflow, as fields other views can use."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/networkanalyser/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/networkanalyser",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/networkanalyser/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/networkanalyser/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/networkanalyser/sample-data/large.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/networkanalyser/sample-data/payments.csv"
    ]
   }
  },
  {
   "id": "orbitaltransactionflow",
   "name": "Orbital Transaction Flow",
   "category": "Network",
   "categories": [
    "Network"
   ],
   "subcategory": null,
   "description": "A day of transactions replayed in seconds. Each one flies from sender to receiver, and the nodes grow with what they have sent and received.",
   "tags": [
    "custom",
    "transaction",
    "flow",
    "circle",
    "gooey",
    "orbit"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "date",
     "title": "Transaction time",
     "type": "GROUPING",
     "description": "When each transaction happened; transactions fly in this order. Use Unique values to show every transaction, or a histogram (for example per hour) to combine transactions between the same sender and receiver in each interval into one."
    },
    {
     "name": "link",
     "title": "Transaction identifier",
     "type": "FIELD",
     "description": "Optional field that identifies each transaction, so that two transactions with the same time, sender and receiver stay separate. Not used when Transaction time is a histogram."
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "One orbit per value, side by side"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "One orbit per value, one above the other"
    },
    {
     "name": "size",
     "title": "Transaction size",
     "type": "MEASURE",
     "description": "Sizes the flying dots and adds up into each node's Sent and Received totals, for example the sum of Amount. Record count counts transactions."
    },
    {
     "name": "source",
     "title": "Sender",
     "type": "FIELD",
     "description": "Field naming who sends each transaction, for example From account"
    },
    {
     "name": "target",
     "title": "Receiver",
     "type": "FIELD",
     "description": "Field naming who receives each transaction, for example To account"
    }
   ],
   "options": [
    {
     "name": "animationDuration",
     "title": "Duration (seconds)",
     "type": "NUMBER",
     "description": "How long one replay of all the transactions takes, from 1 to 100 seconds. Default 10."
    },
    {
     "name": "animationRestartOnData",
     "title": "Replay on every refresh",
     "type": "TOGGLE",
     "description": "Off (default): when the data is refreshed, only transactions later than the last one shown fly in, and a change of filter or settings shows the new totals at once. On: every refresh, filter or settings change replays all the transactions."
    },
    {
     "name": "txLabels",
     "title": "Show transaction details",
     "type": "TOGGLE",
     "description": "Shows the sender, receiver, time and size of each transaction in a box at the top left as it flies."
    },
    {
     "name": "centreNodeId",
     "title": "Centre node",
     "type": "TEXT",
     "description": "The sender or receiver to place at the centre, typed exactly as it appears in the data, for example Group treasury. If empty, the busiest one (largest total sent and received) is placed at the centre."
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view is for a few tens of parties around one hub, when the order and timing of the flows is the story: a briefing, or a wall screen fed by a source that refreshes; pair it with a table when exact figures matter.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Sankey",
     "page": null,
     "note": "Totals flowing between parties, without the replay over time."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "globeflows",
     "name": "Globe Flows",
     "page": "https://visokio.github.io/omniscope-custom-views/globeflows/index.html",
     "note": "Flows between places, as arcs on a 3D globe."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Connectors/Etherscan",
     "name": "Etherscan",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Connectors/Etherscan/index.html",
     "note": "Loads the transactions of Ethereum addresses (from, to, time, amount), data this view can replay."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/orbitaltransactionflow/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/orbitaltransactionflow",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/orbitaltransactionflow/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/orbitaltransactionflow/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/orbitaltransactionflow/sample-data/transfers.csv"
    ]
   }
  },
  {
   "id": "orgchart",
   "name": "Org Chart",
   "category": "Network",
   "categories": [
    "Network"
   ],
   "subcategory": null,
   "description": "The organisation as people actually see it: cards, teams and reporting lines, built live from your HR data, with team size and cost rolled up at every level.",
   "tags": [
    "custom",
    "org chart",
    "organisation",
    "hierarchy",
    "tree",
    "hr",
    "people",
    "span of control",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "id",
     "title": "Person",
     "type": "FIELD",
     "description": "Unique identifier of each person (or position, unit or account)"
    },
    {
     "name": "parent",
     "title": "Reports to",
     "type": "FIELD",
     "description": "Identifier of each person's manager (parent); empty for the top of the tree"
    },
    {
     "name": "label",
     "title": "Card title",
     "type": "FIELD",
     "description": "Text shown in bold on each card, e.g. Name (default: the ID)"
    },
    {
     "name": "subtitle",
     "title": "Card subtitle",
     "type": "FIELD",
     "description": "Second line on each card, e.g. Job title"
    },
    {
     "name": "colour",
     "title": "Colour by",
     "type": "FIELD",
     "description": "Category for the card colour strip, e.g. Department (eight colours)"
    },
    {
     "name": "metric",
     "title": "Card value",
     "type": "FIELD",
     "description": "Optional number shown on each card and summed for each manager's team, e.g. Salary or Open roles"
    }
   ],
   "options": [
    {
     "name": "orientation",
     "title": "Layout",
     "type": "CHOICE",
     "description": "Direction of the tree"
    },
    {
     "name": "depth",
     "title": "Levels open",
     "type": "NUMBER",
     "description": "Number of levels expanded when the chart opens (default 2)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Tree** and **Radial Tree** views can draw a reporting hierarchy; this view is for the organisation chart people expect, with a whole team selected in one click.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Tree",
     "page": null,
     "note": "Draws the same reporting hierarchy from manager and employee fields (a linked network). This view adds person cards, team sizes, rolled-up values, search and collapsing teams."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Radial Tree",
     "page": null,
     "note": "The same hierarchy laid out radially, without cards."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/orgchart/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/orgchart",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/orgchart/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/orgchart/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/orgchart/sample-data/people.csv"
    ]
   }
  },
  {
   "id": "paygap",
   "name": "Pay Gap",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "Understand your pay gap, not just report it. The gender pay gap measures reported in Great Britain, from employee data, with the quartiles, the distribution and a breakdown that shows where the gap comes from.",
   "tags": [
    "custom",
    "gender pay gap",
    "pay gap",
    "hr",
    "equality",
    "pay quartiles",
    "bonus",
    "reporting",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "group",
     "title": "Groups",
     "type": "FIELD",
     "description": "The two groups to compare, e.g. Gender (other values are left out and counted)"
    },
    {
     "name": "pay",
     "title": "Hourly pay",
     "type": "FIELD",
     "description": "Hourly pay of each employee"
    },
    {
     "name": "bonus",
     "title": "Bonus",
     "type": "FIELD",
     "description": "Optional: bonus paid in the period (0 or blank for none)"
    },
    {
     "name": "breakdown",
     "title": "Break down by",
     "type": "FIELD",
     "description": "Optional: show the gap within each department, grade or location"
    }
   ],
   "options": [
    {
     "name": "reference",
     "title": "Reference group",
     "type": "TEXT",
     "description": "The group the gap is measured against (default: Male or Men if present)"
    },
    {
     "name": "comparison",
     "title": "Compared group",
     "type": "TEXT",
     "description": "The other group (default: Female or Women if present)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view calculates the measures used in gender pay gap reporting in Great Britain from employee-level data: mean and median pay and bonus gaps, bonus shares and pay quartiles, with a breakdown that shows where the gap comes from.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Mirror Bar",
     "page": null,
     "note": "Two groups side by side, without the statutory measures."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/paygap/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/paygap",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/paygap/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/paygap/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/paygap/sample-data/employees.csv"
    ]
   }
  },
  {
   "id": "processmap",
   "name": "Process Map",
   "category": "Network",
   "categories": [
    "Network"
   ],
   "subcategory": null,
   "description": "See how work really flows. Point it at an event log and get the process map, the rework loops, the slow handovers and the most common paths, mined live from your systems' data.",
   "tags": [
    "custom",
    "process mining",
    "process map",
    "event log",
    "workflow",
    "journey",
    "variants",
    "bottleneck",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "case",
     "title": "Cases",
     "type": "FIELD",
     "description": "Identifier of each case, e.g. Claim ID, Order ID, Patient episode"
    },
    {
     "name": "activity",
     "title": "Steps",
     "type": "FIELD",
     "description": "The step that happened, e.g. Registered, Assessed, Paid"
    },
    {
     "name": "time",
     "title": "Ordered by",
     "type": "FIELD",
     "description": "When the step happened; orders the steps within each case"
    }
   ],
   "options": [
    {
     "name": "metric",
     "title": "Show on links",
     "type": "CHOICE",
     "description": "What each arrow is labelled with"
    },
    {
     "name": "detail",
     "title": "Detail",
     "type": "NUMBER",
     "description": "Hide links followed by fewer than this percentage of cases (default 2); use the slider in the view to adjust"
    },
    {
     "name": "maxEvents",
     "title": "Events used",
     "type": "NUMBER",
     "description": "Maximum number of events fetched (default 200,000)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Sankey** view can show flows between steps, but process mining needs events ordered within each case, rework loops, variants and the time between steps, which this view works out from a raw event log.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Sankey",
     "page": null,
     "note": "Shows flows between steps, but does not order events within each case or show rework loops."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "eventfunnel",
     "name": "Event Funnel",
     "page": "https://visokio.github.io/omniscope-custom-views/eventfunnel/index.html",
     "note": "Conversion through a fixed sequence of steps, from the same kind of event log."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Case-Bottlenecks",
     "name": "Case Duration and Bottlenecks",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Case-Bottlenecks/index.html",
     "note": "Case durations, rework and the slowest handovers between activities as tables, from the same event log."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Path-Analysis",
     "name": "Path Analysis",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Path-Analysis/index.html",
     "note": "The most common event sequences, step-numbered transitions and next-step probabilities as tables."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/processmap/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/processmap",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/processmap/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/processmap/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/processmap/sample-data/claims.csv"
    ]
   }
  },
  {
   "id": "pvmbridge",
   "name": "Price Volume Mix",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "Revenue went up 2%. Was that price, volume, mix or new products? The bridge answers in one picture, and the table shows which products did it.",
   "tags": [
    "custom",
    "price volume mix",
    "pvm",
    "bridge",
    "waterfall",
    "variance",
    "revenue",
    "finance",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "item",
     "title": "Products",
     "type": "FIELD",
     "description": "The level at which price and mix are measured, e.g. Product or SKU"
    },
    {
     "name": "period",
     "title": "Period",
     "type": "FIELD",
     "description": "Field holding the periods to compare, e.g. Year or Quarter (text or numbers work best)"
    },
    {
     "name": "volume",
     "title": "Volume",
     "type": "FIELD",
     "description": "Units sold (summed)"
    },
    {
     "name": "revenue",
     "title": "Revenue",
     "type": "FIELD",
     "description": "Revenue (summed); price is revenue divided by volume per product"
    }
   ],
   "options": [
    {
     "name": "base",
     "title": "Base period",
     "type": "TEXT",
     "description": "Value of Period to compare from, e.g. 2024 (default: the second latest)"
    },
    {
     "name": "current",
     "title": "Current period",
     "type": "TEXT",
     "description": "Value of Period to compare to, e.g. 2025 (default: the latest)"
    },
    {
     "name": "topN",
     "title": "Products in table",
     "type": "NUMBER",
     "description": "Number of products listed in the breakdown (largest changes first, default 12)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Waterfall** view draws the same bridge, so the chart is not new; the value is splitting a change in revenue into price, volume and mix effects per item.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Waterfall",
     "page": null,
     "note": "The same bridge chart; this view calculates the price, volume and mix effects itself. If the effects are already calculated, use Waterfall."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Price-Volume-Mix",
     "name": "Price-Volume-Mix Bridge",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Price-Volume-Mix/index.html",
     "note": "Calculates the same bridge in the workflow, optionally per group, with each item's effects and the bar start and end for a waterfall. Use it when the bridge is needed as data; use this view to explore it in a report."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "variancechart",
     "name": "Variance Chart",
     "page": "https://visokio.github.io/omniscope-custom-views/variancechart/index.html",
     "note": "Actual against plan per row or period, with absolute and percentage variances."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/pvmbridge/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/pvmbridge",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/pvmbridge/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/pvmbridge/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/pvmbridge/sample-data/sales.csv"
    ]
   }
  },
  {
   "id": "quadrant",
   "name": "Quadrant Matrix",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Where should we focus? Any two measures, four named quadrants, and every item in its place, from live data in an Omniscope report.",
   "tags": [
    "custom",
    "quadrant",
    "matrix",
    "bcg",
    "priority",
    "importance performance",
    "portfolio",
    "scatter",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "item",
     "title": "Items",
     "type": "GROUPING",
     "description": "One point per value, e.g. Product line, Customer, Project"
    },
    {
     "name": "x",
     "title": "Across",
     "type": "MEASURE",
     "description": "Measure for the horizontal axis"
    },
    {
     "name": "y",
     "title": "Up",
     "type": "MEASURE",
     "description": "Measure for the vertical axis"
    },
    {
     "name": "size",
     "title": "Bubble size",
     "type": "MEASURE",
     "description": "Optional: e.g. Revenue"
    },
    {
     "name": "colour",
     "title": "Colour by",
     "type": "GROUPING",
     "description": "Optional: e.g. Business unit"
    }
   ],
   "options": [
    {
     "name": "xSplit",
     "title": "Split across at",
     "type": "CHOICE",
     "description": "Where to split this axis"
    },
    {
     "name": "xTarget",
     "title": "Across target",
     "type": "NUMBER",
     "description": "With Split across at Target value"
    },
    {
     "name": "ySplit",
     "title": "Split up at",
     "type": "CHOICE",
     "description": "Where to split this axis"
    },
    {
     "name": "yTarget",
     "title": "Up target",
     "type": "NUMBER",
     "description": "With Split up at Target value"
    },
    {
     "name": "preset",
     "title": "Quadrant names",
     "type": "CHOICE",
     "description": "Names written in the corners; Custom uses the four names below"
    },
    {
     "name": "qTR",
     "title": "Top right",
     "type": "TEXT"
    },
    {
     "name": "qTL",
     "title": "Top left",
     "type": "TEXT"
    },
    {
     "name": "qBR",
     "title": "Bottom right",
     "type": "TEXT"
    },
    {
     "name": "qBL",
     "title": "Bottom left",
     "type": "TEXT"
    },
    {
     "name": "logX",
     "title": "Log scale across",
     "type": "TOGGLE",
     "description": "Useful for ratios such as relative market share"
    },
    {
     "name": "labels",
     "title": "Labels",
     "type": "TOGGLE",
     "description": "Label the largest points where there is room"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Scatter** view shows the same points, so the plotting is not new; the value is the two-by-two, with split lines at medians, averages or targets.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Scatter",
     "page": null,
     "note": "The same points; this view adds the quadrant splits, quadrant names and selecting a whole quadrant. For a plain scatter, use Scatter."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "motionbubbles",
     "name": "Motion Bubbles",
     "page": "https://visokio.github.io/omniscope-custom-views/motionbubbles/index.html",
     "note": "Bubbles on two axes animated through time, with optional reference lines."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "venndiagram",
     "name": "Venn Diagram",
     "page": "https://visokio.github.io/omniscope-custom-views/venndiagram/index.html",
     "note": "Splits records by ranges of three numeric fields, with each overlap selectable."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/quadrant/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/quadrant",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/quadrant/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/quadrant/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/quadrant/sample-data/customer_feedback.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/quadrant/sample-data/products.csv"
    ]
   }
  },
  {
   "id": "rfmsegments",
   "name": "RFM Segments",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "Know which customers to reward, which to win back and which you have already lost. RFM segmentation from your transaction data, live in a report, with the value of every segment and what to do about it.",
   "tags": [
    "custom",
    "rfm",
    "segmentation",
    "customers",
    "crm",
    "retention",
    "recency",
    "marketing",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "customer",
     "title": "Customers",
     "type": "FIELD",
     "description": "Customer identifier, e.g. Customer ID or Account number"
    },
    {
     "name": "date",
     "title": "Dated by",
     "type": "FIELD",
     "description": "Date of each purchase or transaction"
    },
    {
     "name": "value",
     "title": "Spend",
     "type": "FIELD",
     "description": "Value of each purchase, e.g. Order value or Revenue"
    },
    {
     "name": "orders",
     "title": "Count purchases by",
     "type": "FIELD",
     "description": "Optional: an order ID, so several lines of one order count as one purchase"
    }
   ],
   "options": [
    {
     "name": "maxCustomers",
     "title": "Customers used",
     "type": "NUMBER",
     "description": "Maximum number of customers fetched (default 200,000)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view scores customers on recency, frequency and spend straight from transactions and shows the segments on the standard grid, to explore them in a report.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/RFM-Segmentation",
     "name": "RFM Segmentation",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/RFM-Segmentation/index.html",
     "note": "Scores customers in the workflow and outputs each one's R, F and M scores and segment (ten named segments). Use it when the segment is needed as a field, for campaigns or exports; use this view to explore segments in a report."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Pivot",
     "page": null,
     "note": "Could show segments once scores are calculated in the workflow."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "venndiagram",
     "name": "Venn Diagram",
     "page": "https://visokio.github.io/omniscope-custom-views/venndiagram/index.html",
     "note": "Overlaps of three conditions on numeric fields, such as frequent, high-spending and recent, with each region selectable."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/rfmsegments/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/rfmsegments",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/rfmsegments/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/rfmsegments/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/rfmsegments/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "ridgeline",
   "name": "Ridgeline",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Averages hide the story. See the whole distribution for every group at once: where most values fall, how long the tail is, and which groups behave differently.",
   "tags": [
    "custom",
    "ridgeline",
    "joyplot",
    "distribution",
    "density",
    "histogram",
    "compare",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "category",
     "title": "Rows",
     "type": "FIELD",
     "description": "One distribution per value of this field, e.g. Hour of day, Carrier, Product or Region"
    },
    {
     "name": "value",
     "title": "Distribution of",
     "type": "FIELD",
     "description": "Numeric field whose distribution is drawn, e.g. Wait seconds, Delivery hours, Price"
    }
   ],
   "options": [
    {
     "name": "bins",
     "title": "Detail",
     "type": "NUMBER",
     "description": "Number of bins across the range before smoothing (default 60)"
    },
    {
     "name": "smooth",
     "title": "Smoothing",
     "type": "NUMBER",
     "description": "Gaussian smoothing in bins (0 = raw histogram, default 1.5)"
    },
    {
     "name": "overlap",
     "title": "Overlap",
     "type": "NUMBER",
     "description": "How far each ridge rises into the row above (default 1.8)"
    },
    {
     "name": "sort",
     "title": "Order rows by",
     "type": "CHOICE",
     "description": "Row order"
    },
    {
     "name": "maxRows",
     "title": "Maximum rows",
     "type": "NUMBER",
     "description": "Largest number of rows to draw (most records first when limited; default 25)"
    },
    {
     "name": "normalise",
     "title": "Same height for every row",
     "type": "TOGGLE",
     "description": "Scale each ridge to its own peak, so shapes compare even when counts differ"
    },
    {
     "name": "showMedian",
     "title": "Show medians",
     "type": "TOGGLE",
     "description": "Mark each row's median and write it at the right"
    },
    {
     "name": "trim",
     "title": "Trim extreme values",
     "type": "TOGGLE",
     "description": "Set the range from the quartiles (up to three interquartile ranges beyond them) so a few outliers do not squash the chart"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Box Plot** view summarises each group in five numbers; this view shows the full shape for dozens of groups at once, revealing the peaks, tails and gaps a box plot hides.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Box Plot",
     "page": null,
     "note": "Compares distributions by category as five-number summaries rather than shapes."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "beeswarm",
     "name": "Beeswarm",
     "page": "https://visokio.github.io/omniscope-custom-views/beeswarm/index.html",
     "note": "Every value as its own dot, for up to 1,000 items."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "distribution",
     "name": "Distribution",
     "page": "https://visokio.github.io/omniscope-custom-views/distribution/index.html",
     "note": "One detailed histogram with percentiles and outliers; groups shown as outlines."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/ridgeline/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/ridgeline",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/ridgeline/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/ridgeline/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/ridgeline/sample-data/calls.csv"
    ]
   }
  },
  {
   "id": "runningpivot",
   "name": "Running Pivot View",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "Totals to date, period by period, side by side: a pivot table whose cells add up down each column.",
   "tags": [
    "pivot",
    "running",
    "totals",
    "running total"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "measures",
     "title": "Measure",
     "type": "MEASURE",
     "description": "The value added up down each column, for example the sum of Sales. Use a measure that adds up: a sum or a record count"
    },
    {
     "name": "paneX",
     "title": "Columns",
     "type": "GROUPING",
     "description": "Optional: one column of running totals per value, for example Region. Several fields nest"
    },
    {
     "name": "paneY",
     "title": "Rows",
     "type": "GROUPING",
     "description": "The order of the running total, for example Order date by month. Several fields nest; the total runs through all of them"
    }
   ],
   "options": [],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "The core **Pivot** view shows each period's own value; this view shows the total so far down each column, for year-to-date and cumulative figures in a table.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pivot",
     "page": null,
     "note": "Shows each cell's own value; this view adds the values down the rows, so each cell is the total so far."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "yearonyear",
     "name": "Year on Year",
     "page": "https://visokio.github.io/omniscope-custom-views/yearonyear/index.html",
     "note": "Running totals through the year as lines, this year against last."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/Multi-Row-Formula",
     "name": "Multi-Row Formula",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/Multi-Row-Formula/index.html",
     "note": "Adds running totals (and other window calculations) as fields, when they are needed in the data."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/runningpivot/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/runningpivot",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/runningpivot/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/runningpivot/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/runningpivot/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "scatter3d",
   "name": "3D Scatter",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "See your segments in three dimensions: rotate, zoom and click through thousands of customers, products or readings, coloured by segment and sized by value, inside any Omniscope report.",
   "tags": [
    "custom",
    "3d",
    "scatter",
    "three.js",
    "webgl",
    "point cloud",
    "cluster",
    "segmentation",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "point",
     "title": "Points",
     "type": "GROUPING",
     "description": "One point is drawn per unique value of this field, e.g. Customer ID. Selection filters on this field."
    },
    {
     "name": "x",
     "title": "X axis",
     "type": "MEASURE",
     "description": "Numeric value for the X axis (left to right)"
    },
    {
     "name": "y",
     "title": "Y axis",
     "type": "MEASURE",
     "description": "Numeric value for the Y axis (bottom to top)"
    },
    {
     "name": "z",
     "title": "Z axis",
     "type": "MEASURE",
     "description": "Numeric value for the Z axis (back to front)"
    },
    {
     "name": "colour",
     "title": "Colour by category",
     "type": "GROUPING",
     "description": "Optional category to colour points by, e.g. Segment or Cluster. Up to 8 categories get their own colour; the rest are grouped as Other."
    },
    {
     "name": "colourValue",
     "title": "Colour by value",
     "type": "MEASURE",
     "description": "Optional numeric value to shade points light to dark. Ignored when Colour by category is set."
    },
    {
     "name": "size",
     "title": "Size",
     "type": "MEASURE",
     "description": "Optional numeric value to size points by (area proportional to value)"
    }
   ],
   "options": [
    {
     "name": "pointScale",
     "title": "Point size",
     "type": "NUMBER",
     "description": "Multiplier for the size of every point. 1 is the default."
    },
    {
     "name": "theme",
     "title": "Background",
     "type": "CHOICE",
     "description": "Light or dark scene background"
    },
    {
     "name": "autoRotate",
     "title": "Auto rotate",
     "type": "TOGGLE",
     "description": "Slowly rotate the scene. Drag to rotate by hand, scroll to zoom, right-drag to pan."
    },
    {
     "name": "showAxes",
     "title": "Show axes and grid",
     "type": "TOGGLE",
     "description": "Draw the bounding box, grid lines and axis labels"
    }
   ],
   "outputs": [],
   "libraries": [
    "three 0.147.0"
   ],
   "relatedSummary": "The core **Scatter** view suits most 3D plotting; this view is for an orbiting scene, typically of clusters or components from the workflow.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Scatter",
     "page": null,
     "note": "The core Scatter view also plots in 3D and is better integrated with the report, so it suits most data. Use this view for an orbiting three.js scene with depth cues, up to about 15,000 points."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "surface3d",
     "name": "3D Surface",
     "page": "https://visokio.github.io/omniscope-custom-views/surface3d/index.html",
     "note": "A measure drawn as a 3D surface over two groupings, rather than points placed by three measures."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Principal-Components",
     "name": "Principal Component Analysis",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Principal-Components/index.html",
     "note": "PCA with scores per row: three components make the axes of this view."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Clustering/KMeans",
     "name": "KMeans",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Clustering/KMeans/index.html",
     "note": "Adds a Cluster field from k-means, to colour the points by."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Clustering",
     "page": null,
     "note": "Finds clusters in numeric fields, to colour the points by."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Reduce Dimensions",
     "page": null,
     "note": "Reduces many numeric fields to a few dimensions, three of which make the axes here."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/scatter3d/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/scatter3d",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/scatter3d/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/scatter3d/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/scatter3d/sample-data/customers.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/scatter3d/sample-data/large.csv"
    ]
   }
  },
  {
   "id": "sequentialworkflowexecution",
   "name": "Sequential Workflow Execution",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "A button in the report that runs workflow blocks one after another, in your order, and stops at the first failure.",
   "tags": [
    "custom",
    "workflow",
    "job",
    "execute",
    "execution",
    "block",
    "api"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [],
   "options": [
    {
     "name": "block",
     "title": "Blocks to execute",
     "type": "TEXT",
     "description": "Names of the workflow blocks to execute, in order, separated by commas, e.g. Load orders, Clean, Report. Each one starts when the one before has finished; a failure stops the rest."
    },
    {
     "name": "buttonText",
     "title": "Button text",
     "type": "TEXT",
     "description": "Text on the button. If empty: Execute"
    },
    {
     "name": "refreshFromSource",
     "title": "Refresh from source",
     "type": "TOGGLE",
     "description": "On: the blocks reload their data from the sources. Off: data already loaded upstream is reused where possible."
    },
    {
     "name": "showJobState",
     "title": "Show job state",
     "type": "TOGGLE",
     "description": "Show the execution's progress (queued, running, finished) under the button. Errors are always shown."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "Use the community **Workflow Execution** view in most cases. This view is for steps the workflow cannot order, linked only through a file or a database, which it runs one at a time, stopping at a failure.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "workflowexecution",
     "name": "Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/workflowexecution/index.html",
     "note": "Executes all the blocks in one request and lets Omniscope order them by their connections. Use it unless the order of side effects matters."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/ForEach/ForEachMultiStage",
     "name": "For Each Multi Stage",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/ForEach/ForEachMultiStage/index.html",
     "note": "Runs stages of a project one after another, each a separate run, once per input record."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/sequentialworkflowexecution/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/sequentialworkflowexecution",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/sequentialworkflowexecution/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/sequentialworkflowexecution/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/sequentialworkflowexecution/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "setparamandexecute",
   "name": "Set Parameters and Execute",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "Inputs for the project's parameters, and a button that runs the workflow with them. What-if analysis from the report.",
   "tags": [
    "custom",
    "lambda",
    "parameter",
    "param",
    "workflow",
    "job",
    "execute",
    "execution",
    "block",
    "api"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [],
   "options": [
    {
     "name": "block",
     "title": "Blocks to execute",
     "type": "TEXT",
     "description": "Names of the workflow blocks to execute, separated by commas, e.g. Load orders, Report. Leave empty to execute the whole workflow."
    },
    {
     "name": "buttonText",
     "title": "Button text",
     "type": "TEXT",
     "description": "Text on the button. If empty: Execute"
    },
    {
     "name": "paramNames",
     "title": "Parameters to show",
     "type": "TEXT",
     "description": "Names of the project parameters to show, in this order, separated by commas. Leave empty to show them all."
    },
    {
     "name": "refreshFromSource",
     "title": "Refresh from source",
     "type": "TOGGLE",
     "description": "On: the blocks reload their data from the sources. Off: data already loaded upstream is reused where possible."
    },
    {
     "name": "showJobState",
     "title": "Show job state",
     "type": "TOGGLE",
     "description": "Show the execution's progress (queued, running, finished) under the button. Errors are always shown."
    },
    {
     "name": "wGrid",
     "title": "Parameter cell width (px)",
     "type": "NUMBER",
     "description": "Width of each parameter's label and input (default 200)."
    },
    {
     "name": "wInputWidth",
     "title": "Input width (px)",
     "type": "NUMBER",
     "description": "Width of each input box (default 100)."
    },
    {
     "name": "zlabelFontSize",
     "title": "Label size (px)",
     "type": "NUMBER",
     "description": "Font size of the parameter names (default 13)."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "This view puts the project's parameters in the report as typed inputs and executes the workflow with them, for what-if reports; the new values are the project's own, for every viewer.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "switchparamandexecute",
     "name": "Switch Param and Execute Workflow",
     "page": "https://visokio.github.io/omniscope-custom-views/switchparamandexecute/index.html",
     "note": "Sets one parameter from a list of a field's values, one click per choice. Use it for a picker; this view for typed values or several parameters."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "lambdaworkflowexecution",
     "name": "Lambda Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/lambdaworkflowexecution/index.html",
     "note": "Runs with the values in a new copy of the project, leaving the project's own parameters unchanged. Use it when several viewers run at once."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "workflowexecution",
     "name": "Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/workflowexecution/index.html",
     "note": "Executes blocks without any parameter inputs."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/Set Project Parameters",
     "name": "Set Project Parameters",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/Set%20Project%20Parameters/index.html",
     "note": "Sets parameters from records in the workflow rather than from a report."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/setparamandexecute/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/setparamandexecute",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/setparamandexecute/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/setparamandexecute/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/setparamandexecute/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "slopechart",
   "name": "Slope Chart",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "What changed between then and now? Every item's start and end on one chart, with the winners, the losers and the reshuffles obvious at a glance.",
   "tags": [
    "custom",
    "slope chart",
    "before and after",
    "change",
    "comparison",
    "ranking",
    "market share",
    "movers",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "item",
     "title": "Items",
     "type": "GROUPING",
     "description": "What to compare, e.g. Brand, Product, Region"
    },
    {
     "name": "period",
     "title": "Periods",
     "type": "GROUPING",
     "description": "The periods to compare, e.g. Year (the first and last are used unless From and To are set)"
    },
    {
     "name": "value",
     "title": "Measure",
     "type": "MEASURE",
     "description": "e.g. sum of Sales"
    }
   ],
   "options": [
    {
     "name": "from",
     "title": "From",
     "type": "TEXT",
     "description": "Optional: the earlier period, as it appears in the data (e.g. 2022)"
    },
    {
     "name": "to",
     "title": "To",
     "type": "TEXT",
     "description": "Optional: the later period (e.g. 2026)"
    },
    {
     "name": "show",
     "title": "Show",
     "type": "CHOICE",
     "description": "Compare values, shares of the total in each period, or ranks"
    },
    {
     "name": "topN",
     "title": "Items shown",
     "type": "NUMBER",
     "description": "The largest items are shown (default 15)"
    },
    {
     "name": "flat",
     "title": "Flat below %",
     "type": "NUMBER",
     "description": "Changes smaller than this are drawn in grey (default 5)"
    },
    {
     "name": "zeroBase",
     "title": "Start at zero",
     "type": "TOGGLE",
     "description": "Start the value axis at zero; turn off to spread small differences"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view draws the change between two periods as slopes, so rises, falls and reordering read at a glance, and can show values, shares or ranks.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Dumbbell",
     "page": null,
     "note": "Two values per item, side by side rather than as slopes."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "bumpchart",
     "name": "Bump Chart",
     "page": "https://visokio.github.io/omniscope-custom-views/bumpchart/index.html",
     "note": "Rank over many periods, rather than change between two."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/slopechart/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/slopechart",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/slopechart/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/slopechart/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/slopechart/sample-data/brand_sales.csv"
    ]
   }
  },
  {
   "id": "spainforcedotdensitymap",
   "name": "Spain Force Dot Density Map",
   "category": "Map",
   "categories": [
    "Map"
   ],
   "subcategory": null,
   "description": "Every site, customer or incident in Spain as its own dot, none hidden behind another. How many there are in each place, at a glance.",
   "tags": [
    "custom",
    "map",
    "dot",
    "density",
    "force",
    "jitter",
    "spain"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "lat",
     "title": "Dot latitude",
     "type": "MEASURE",
     "description": "Latitude of each dot in decimal degrees, for example the mean of a Latitude field"
    },
    {
     "name": "lon",
     "title": "Dot longitude",
     "type": "MEASURE",
     "description": "Longitude of each dot in decimal degrees (west is negative), for example the mean of a Longitude field"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING"
    },
    {
     "name": "split",
     "title": "Split",
     "type": "GROUPING",
     "description": "One dot per value of this grouping, for example per site or per customer. Click a dot to select its value"
    },
    {
     "name": "colour",
     "title": "Colour",
     "type": "MEASURE",
     "description": "Colours the dots by category. Use a text field with the Singleton function (for example Region), which gives each dot its one value"
    },
    {
     "name": "tooltipvalue",
     "title": "Tooltip value",
     "type": "MEASURE",
     "description": "A figure shown in a dot's tooltip, for example the sum of Sales"
    }
   ],
   "options": [
    {
     "name": "dotsize",
     "title": "Dot radius (pixels)",
     "type": "NUMBER",
     "description": "Radius of each dot in pixels. If empty, the dots get smaller as their number grows (1.2 to 4 pixels)"
    },
    {
     "name": "tooltiptitle",
     "title": "Tooltip label",
     "type": "TEXT",
     "description": "Label for the Tooltip value in a dot's tooltip. If empty, the measure's name is used"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Map** view is the usual choice. This view is for counting by eye in Spain: the size of a cluster shows how many items are there.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Map",
     "page": null,
     "note": "Places markers at their exact positions anywhere, where they pile up in a busy town. This view covers Spain only and pushes dots apart so each one shows."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/spainforcedotdensitymap/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/spainforcedotdensitymap",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/spainforcedotdensitymap/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/spainforcedotdensitymap/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/spainforcedotdensitymap/sample-data/charging_points.csv"
    ]
   }
  },
  {
   "id": "sparklinescorecard",
   "name": "Sparkline Scorecard",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "The weekly review on one screen: every store, product or region with its trend, its number, its change and whether it is on track, sorted so the problems are at the top.",
   "tags": [
    "custom",
    "scorecard",
    "sparkline",
    "kpi",
    "target",
    "status",
    "table",
    "dashboard",
    "rag",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "rows",
     "title": "Rows",
     "type": "GROUPING",
     "description": "One scorecard row per value, e.g. Store, Product, Region or Account manager"
    },
    {
     "name": "time",
     "title": "Time",
     "type": "GROUPING",
     "description": "Periods for the trend, e.g. Week or Month (a date grouped by week or month)"
    },
    {
     "name": "value",
     "title": "Value",
     "type": "MEASURE",
     "description": "The measure tracked, e.g. sum of Sales"
    },
    {
     "name": "target",
     "title": "Target",
     "type": "MEASURE",
     "description": "Optional target for the same periods, e.g. sum of Target. Enables attainment and status."
    }
   ],
   "options": [
    {
     "name": "direction",
     "title": "Good direction",
     "type": "CHOICE",
     "description": "Used for the colour of changes and for status against target"
    },
    {
     "name": "headline",
     "title": "Headline value",
     "type": "CHOICE",
     "description": "Which number each row leads with"
    },
    {
     "name": "compare",
     "title": "Change compared with",
     "type": "CHOICE",
     "description": "Basis for the change column"
    },
    {
     "name": "periods",
     "title": "Periods in trend",
     "type": "NUMBER",
     "description": "Show the most recent N periods (default 13)"
    },
    {
     "name": "tolerance",
     "title": "At-risk band (%)",
     "type": "NUMBER",
     "description": "Within this percentage short of target a row is At risk rather than Off track (default 5)"
    },
    {
     "name": "sortBy",
     "title": "Sort rows by",
     "type": "CHOICE",
     "description": "Row order"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "The core **Aggregated Table** and **KPI** views cover sparklines and headline figures; this view is a ready-made scorecard, with an On track, At risk or Off track status per item, sorted so the problems come first.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Aggregated Table",
     "page": null,
     "note": "Can show a small line or bar chart in its cells. This view lays out one row per KPI with latest value, change, trend and status against a target."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "KPI",
     "page": null,
     "note": "One headline value, without a trend or target status."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/sparklinescorecard/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/sparklinescorecard",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/sparklinescorecard/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/sparklinescorecard/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/sparklinescorecard/sample-data/stores.csv"
    ]
   }
  },
  {
   "id": "spcchart",
   "name": "SPC Control Chart",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Stop reacting to every wiggle. See which changes in a measure are real, which are noise, and whether the process will hit its target, with the statistics done for you.",
   "tags": [
    "custom",
    "spc",
    "control chart",
    "xmr",
    "statistical process control",
    "quality",
    "variation",
    "nhs",
    "six sigma",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "time",
     "title": "Time",
     "type": "GROUPING",
     "description": "The time or sequence axis, e.g. Arrival date grouped by week, Batch number, Month"
    },
    {
     "name": "value",
     "title": "Value",
     "type": "MEASURE",
     "description": "The measure to monitor, one value per time point, e.g. mean of Wait minutes, sum of Defects"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING"
    }
   ],
   "options": [
    {
     "name": "direction",
     "title": "Improvement is",
     "type": "CHOICE",
     "description": "Which direction counts as improvement. Special-cause points are then shown as improvement or concern."
    },
    {
     "name": "target",
     "title": "Target",
     "type": "NUMBER",
     "description": "Optional target line. With an improvement direction, the view says whether the process can be relied on to meet it."
    },
    {
     "name": "baseline",
     "title": "Baseline points",
     "type": "NUMBER",
     "description": "Calculate the limits from the first N points only (0 uses all points)"
    },
    {
     "name": "rebase",
     "title": "Recalculate limits at",
     "type": "TEXT",
     "description": "Optional comma-separated time points where the process changed (e.g. 2025-02-03); limits are recalculated from each one"
    },
    {
     "name": "runLength",
     "title": "Shift rule: points in a run",
     "type": "NUMBER",
     "description": "Consecutive points on one side of the mean that signal a shift (default 7)"
    },
    {
     "name": "trendLength",
     "title": "Trend rule: points rising or falling",
     "type": "NUMBER",
     "description": "Consecutive increases or decreases that signal a trend (default 6)"
    },
    {
     "name": "showMR",
     "title": "Show moving range chart",
     "type": "TOGGLE",
     "description": "Show the moving range (mR) chart under the main chart"
    },
    {
     "name": "showSigma",
     "title": "Show one and two sigma bands",
     "type": "TOGGLE",
     "description": "Shade the zones between the mean and the limits"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Timeseries** view draws the measure over time. This view adds what statistical process control needs: XmR control limits, the standard run rules and plain-English verdicts on improvement and on meeting a target, for a measure watched closely.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Timeseries",
     "page": null,
     "note": "The same series over time, without control limits or run rules."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Time-Series-Anomalies",
     "name": "Time Series Anomaly Detection",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Time-Series-Anomalies/index.html",
     "note": "Flags spikes and dips in many series at once against a rolling baseline, with weekday effects."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/spcchart/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/spcchart",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/spcchart/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/spcchart/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/spcchart/sample-data/attendances.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/spcchart/sample-data/weekly.csv"
    ]
   }
  },
  {
   "id": "strata",
   "name": "Strata",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Things that open and close - tickets, sessions, projects, patients on a ward - as a stack of lines over time. How much was open at each moment, and what each one was doing.",
   "tags": [
    "custom",
    "time",
    "timeline",
    "gantt",
    "stacked",
    "strata",
    "layers"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "layer",
     "title": "Layer",
     "type": "FIELD",
     "description": "What each line is - a session, a ticket, a project. Its rows are stretches of time; the line runs from its first start to its last end."
    },
    {
     "name": "start",
     "title": "Start",
     "type": "FIELD",
     "description": "When each row's stretch of time starts."
    },
    {
     "name": "end",
     "title": "End",
     "type": "FIELD",
     "description": "When each row's stretch of time ends."
    },
    {
     "name": "label",
     "title": "Label",
     "type": "FIELD",
     "description": "The name shown for a line - on it, and when pointing at it. Defaults to the Layer value."
    },
    {
     "name": "colour",
     "title": "Colour by",
     "type": "FIELD",
     "description": "Lines sharing a value share a colour - e.g. a team or a workspace. Defaults to each layer its own."
    },
    {
     "name": "emphasis",
     "title": "Emphasis",
     "type": "FIELD",
     "description": "Per row, 2 strong, 1 medium, 0 faint (the default). Each pixel of a line shows the strongest stretch in it, so a moment of 2 is never lost."
    },
    {
     "name": "momentAt",
     "title": "Moment time",
     "type": "FIELD",
     "description": "Rows with a time here (and no Start or End) are moments on their line, at that time - a commit, say, appended from a table of its own - drawn as a tiny triangle above it. Rows whose Start and End are the same are moments too."
    },
    {
     "name": "moment",
     "title": "Moment kind",
     "type": "FIELD",
     "description": "What kind each moment is. With this field, the commonest kind is a pinch on the line (a tiny triangle above it, its point on the line) and the next a badge with a tick (a merge, say)."
    },
    {
     "name": "foot",
     "title": "Foot line",
     "type": "FIELD",
     "description": "Rows with no Layer but a value here are drawn as a heavy line along the foot - up to two values, the more frequent darker. Blank: the foot line is drawn from the lines, wherever any is strong."
    }
   ],
   "options": [
    {
     "name": "emphasisNames",
     "title": "Emphasis names",
     "type": "TEXT",
     "description": "What the tooltip calls strong, medium and faint stretches, separated by commas - e.g. Being worked, Waiting, Queued. Empty: strong, medium, faint."
    },
    {
     "name": "order",
     "title": "Stacking",
     "type": "CHOICE",
     "description": "Longest-lived on top: short-lived layers slide in beneath and lift the long ones. Longest-lived at the bottom: the long ones lie flat, short-lived layers ride on top of them. Oldest at the bottom: new layers go on top."
    },
    {
     "name": "labels",
     "title": "Line labels",
     "type": "CHOICE",
     "description": "Where the lines still open at the right edge are named; point at any line for its name."
    },
    {
     "name": "intro",
     "title": "Opening",
     "type": "CHOICE",
     "description": "How the view opens, the first time it loads: glide in from the whole range to about a week on the screen, or replay the whole range from left to right, or neither."
    },
    {
     "name": "workday",
     "title": "Working-day marks",
     "type": "TOGGLE",
     "description": "Under the foot line, each day's 8am-4pm with dots at 8, 12 and 4."
    },
    {
     "name": "standup",
     "title": "Daily meeting",
     "type": "TEXT",
     "description": "A time such as 09:30, marked on weekdays with the working-day marks."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "The core **Gantt** view gives each task its own row. This view is for thousands of things that open and close: it stacks the ones open at each moment, so the height shows the load while each line still shows what it was doing.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Gantt",
     "page": null,
     "note": "One bar per task from start to end, each on its own row; suited to a plan of tasks rather than thousands of overlapping sessions."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Timeline",
     "page": null,
     "note": "Events as labelled points along a line, for up to 300 events."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "survivalcurve",
     "name": "Survival Curve",
     "page": "https://visokio.github.io/omniscope-custom-views/survivalcurve/index.html",
     "note": "How long such open-and-close records last, and whether groups differ."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Occupancy-From-Intervals",
     "name": "Occupancy From Intervals",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Occupancy-From-Intervals/index.html",
     "note": "Turns start and end times into occupancy per time bucket, with peaks and utilisation against capacity."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/strata/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/strata",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/strata/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/strata/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/strata/sample-data/tickets.csv"
    ]
   }
  },
  {
   "id": "surface3d",
   "name": "3D Surface",
   "category": "Diagram",
   "categories": [
    "Diagram"
   ],
   "subcategory": null,
   "description": "See the shape of your data. Any measure over two dimensions, drawn as a 3D surface you can rotate, zoom and click, live in an Omniscope report.",
   "tags": [
    "custom",
    "3d",
    "surface",
    "three.js",
    "response surface",
    "yield curve",
    "terrain",
    "heatmap",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "x",
     "title": "Across",
     "type": "GROUPING",
     "description": "First direction of the floor, e.g. Maturity, Price, Hour (numbers and dates are spaced to scale)"
    },
    {
     "name": "y",
     "title": "Along",
     "type": "GROUPING",
     "description": "Second direction of the floor, e.g. Month, Weeks before travel, Day"
    },
    {
     "name": "z",
     "title": "Height",
     "type": "MEASURE",
     "description": "The measure that sets the height and colour, e.g. average Yield or sum of Bookings"
    }
   ],
   "options": [
    {
     "name": "colour",
     "title": "Colours",
     "type": "CHOICE",
     "description": "Automatic uses two colours when values are both negative and positive"
    },
    {
     "name": "heightScale",
     "title": "Height scale",
     "type": "NUMBER",
     "description": "Stretch or flatten the surface (default 1)"
    },
    {
     "name": "wireframe",
     "title": "Grid lines",
     "type": "TOGGLE",
     "description": "Draw grid lines on the surface"
    },
    {
     "name": "autoRotate",
     "title": "Spin",
     "type": "TOGGLE",
     "description": "Rotate the scene slowly"
    }
   ],
   "outputs": [],
   "libraries": [
    "three 0.147.0",
    "d3 7.9.0"
   ],
   "relatedSummary": "This view draws one measure as a surface over two groupings, for data where the shape of the ridges and valleys matters, such as yield curves or demand by price and lead time; its From above button gives a heatmap of the same grid.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "scatter3d",
     "name": "3D Scatter",
     "page": "https://visokio.github.io/omniscope-custom-views/scatter3d/index.html",
     "note": "Points placed by three measures, rather than a surface over two groupings."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/surface3d/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/surface3d",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/surface3d/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/surface3d/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/surface3d/sample-data/demand_grid.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/surface3d/sample-data/yield_curves.csv"
    ]
   }
  },
  {
   "id": "survivalcurve",
   "name": "Survival Curve",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "How long do customers stay? How long do machines last? Survival curves answer \"time until\" questions correctly, including the records that have not ended yet, and show whether the difference between groups is real.",
   "tags": [
    "custom",
    "survival",
    "kaplan-meier",
    "churn",
    "retention",
    "tenure",
    "time to event",
    "log-rank",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "start",
     "title": "Start",
     "type": "FIELD",
     "description": "When each record started, e.g. subscription start, hire date, install date"
    },
    {
     "name": "end",
     "title": "End",
     "type": "FIELD",
     "description": "When it ended (churn, leaving, failure); leave blank while still active"
    },
    {
     "name": "duration",
     "title": "Duration",
     "type": "FIELD",
     "description": "Alternative to Start and End: time to the event or to the last observation"
    },
    {
     "name": "event",
     "title": "Event flag",
     "type": "FIELD",
     "description": "With Duration: whether the event happened (1, true, yes); 0, false, no or blank mean still active"
    },
    {
     "name": "group",
     "title": "Compare",
     "type": "FIELD",
     "description": "Optional: one curve per value, e.g. Plan, Channel, Cohort"
    }
   ],
   "options": [
    {
     "name": "unit",
     "title": "Time unit",
     "type": "CHOICE",
     "description": "Unit of the time axis when using Start and End"
    },
    {
     "name": "show",
     "title": "Show",
     "type": "CHOICE",
     "description": "Survival curve, or its complement (cumulative churn or failure)"
    },
    {
     "name": "bands",
     "title": "Confidence bands",
     "type": "TOGGLE",
     "description": "Shade the 95% confidence interval of each curve"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view calculates a retention curve in the report, re-estimated for every filter, where the core **Line** view can only draw one already calculated.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Line",
     "page": null,
     "note": "Can draw a retention curve already calculated. This view calculates it: a Kaplan-Meier estimate with censored records, confidence bands and a log-rank test."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Survival",
     "name": "Survival Analysis",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Survival/index.html",
     "note": "Estimates Kaplan-Meier or Fleming-Harrington curves in the workflow with R, from a numeric time and an event flag. Use it when the curve is needed as data; use this view for interactive curves with a log-rank test."
    },
    {
     "relation": "overlaps",
     "kind": "block",
     "id": "Analytics/Churn-Survival",
     "name": "Churn Survival Curves",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Churn-Survival/index.html",
     "note": "Uses the same method in the workflow and adds retention at chosen milestones, restricted mean lifetime and log-rank tests of each group against the rest. Use it when those figures are needed as data."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "strata",
     "name": "Strata",
     "page": "https://visokio.github.io/omniscope-custom-views/strata/index.html",
     "note": "Draws the same kind of open-and-close records as a timeline."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/survivalcurve/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/survivalcurve",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/survivalcurve/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/survivalcurve/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/survivalcurve/sample-data/subscriptions.csv"
    ]
   }
  },
  {
   "id": "switchparam",
   "name": "Switch Param",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "Radio buttons that set a project parameter, chosen from a field's values.",
   "tags": [
    "custom",
    "parameter",
    "param",
    "api"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "split",
     "title": "Values from",
     "type": "GROUPING",
     "description": "Field whose distinct values become the choices. Use a data source with every value, so the choices do not depend on the parameter itself."
    }
   ],
   "options": [
    {
     "name": "paramName",
     "title": "Parameter name",
     "type": "TEXT",
     "description": "Name of the project parameter to set, exactly as in the workflow's parameters."
    },
    {
     "name": "selectionLimit",
     "title": "Most values shown",
     "type": "NUMBER",
     "description": "Show at most this many values (default 100)."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "This view only sets a parameter, from a list of a field's values; blocks use the new value at their next run, from a schedule or a **Workflow Execution** button.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "switchparamandexecute",
     "name": "Switch Param and Execute Workflow",
     "page": "https://visokio.github.io/omniscope-custom-views/switchparamandexecute/index.html",
     "note": "The same radio buttons, but executes workflow blocks after each change. Use this view when the new value should wait for the next scheduled or manual run."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "workflowexecution",
     "name": "Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/workflowexecution/index.html",
     "note": "A button that executes the workflow, to run with the value set here."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/Set Project Parameters",
     "name": "Set Project Parameters",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/Set%20Project%20Parameters/index.html",
     "note": "Sets parameters from records in the workflow, several in one request."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/Conditional Execution",
     "name": "Conditional Execution",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/Conditional%20Execution/index.html",
     "note": "Starts a run of chosen blocks only when a yes/no parameter, which this view can set, is on."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/switchparam/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/switchparam",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/switchparam/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/switchparam/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/switchparam/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "switchparamandexecute",
   "name": "Switch Param and Execute Workflow",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "Pick a value, and the workflow re-runs with it: a parameter switch for reports built by a parameterised workflow.",
   "tags": [
    "custom",
    "parameter",
    "param",
    "api"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "split",
     "title": "Values from",
     "type": "GROUPING",
     "description": "Field whose distinct values become the choices. Use a data source with every value, so the choices do not depend on the parameter itself."
    }
   ],
   "options": [
    {
     "name": "block",
     "title": "Blocks to execute",
     "type": "TEXT",
     "description": "Names of the workflow blocks to execute, separated by commas, e.g. Load orders, Report. Leave empty to execute the whole workflow."
    },
    {
     "name": "paramName",
     "title": "Parameter name",
     "type": "TEXT",
     "description": "Name of the project parameter to set, exactly as in the workflow's parameters."
    },
    {
     "name": "refreshFromSource",
     "title": "Refresh from source",
     "type": "TOGGLE",
     "description": "On: the blocks reload their data from the sources. Off: data already loaded upstream is reused where possible."
    },
    {
     "name": "selectionLimit",
     "title": "Most values shown",
     "type": "NUMBER",
     "description": "Show at most this many values (default 10)."
    },
    {
     "name": "showJobState",
     "title": "Show job state",
     "type": "TOGGLE",
     "description": "Show the execution's progress (queued, running, finished) under the values. Errors are always shown."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "This view sets one parameter from a list of a field's values and then executes the workflow, so the report shows results for the value picked.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "switchparam",
     "name": "Switch Param",
     "page": "https://visokio.github.io/omniscope-custom-views/switchparam/index.html",
     "note": "Sets the parameter without executing anything. Use it when the workflow is run later, by a schedule or a button."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "setparamandexecute",
     "name": "Set Parameters and Execute",
     "page": "https://visokio.github.io/omniscope-custom-views/setparamandexecute/index.html",
     "note": "Several parameters from typed values rather than one from a list of choices."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "workflowexecution",
     "name": "Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/workflowexecution/index.html",
     "note": "Executes blocks without changing any parameter."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/switchparamandexecute/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/switchparamandexecute",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/switchparamandexecute/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/switchparamandexecute/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/switchparamandexecute/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "targettracker",
   "name": "Target Tracker",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Will we make it? Progress against a target, the projection to the end of the period, and the rate needed from here, live from your data.",
   "tags": [
    "custom",
    "target",
    "pacing",
    "run rate",
    "projection",
    "burn-up",
    "sales target",
    "goal",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "date",
     "title": "Dated by",
     "type": "FIELD",
     "description": "The date of each record, e.g. Booking date"
    },
    {
     "name": "value",
     "title": "Measure",
     "type": "MEASURE",
     "description": "What counts towards the target, e.g. sum of Bookings (default: number of records)"
    }
   ],
   "options": [
    {
     "name": "target",
     "title": "Target",
     "type": "NUMBER",
     "description": "The target for the whole period"
    },
    {
     "name": "start",
     "title": "Start",
     "type": "TEXT",
     "description": "First day of the period as yyyy-mm-dd (default 1 January of the latest year in the data)"
    },
    {
     "name": "end",
     "title": "End",
     "type": "TEXT",
     "description": "Last day of the period as yyyy-mm-dd (default 31 December)"
    },
    {
     "name": "shape",
     "title": "Target path",
     "type": "CHOICE",
     "description": "How the target builds up through the period"
    },
    {
     "name": "recent",
     "title": "Recent days",
     "type": "NUMBER",
     "description": "Days used for the recent run rate (default 28)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Bullet** and **Dial (Arch)** views show progress against a target at one moment. This view follows the cumulative total through the period against a target path, projects where it will end at the average and the recent rate, and gives the daily rate still needed.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Bullet",
     "page": null,
     "note": "Progress against a target at one moment, without the projection to the end of the period."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Dial (Arch)",
     "page": null,
     "note": "Progress at one moment, as a dial."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/targettracker/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/targettracker",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/targettracker/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/targettracker/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/targettracker/sample-data/bookings.csv"
    ]
   }
  },
  {
   "id": "threeforcegraph",
   "name": "3D Force Graph",
   "category": "Network",
   "categories": [
    "Network"
   ],
   "subcategory": null,
   "description": "A network you can turn in your hand. Links between people, accounts or products, laid out in three dimensions so the clusters and the nodes that join them stand out.",
   "tags": [
    "custom",
    "3d",
    "graph",
    "network",
    "three.js"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "source",
     "title": "Source",
     "type": "GROUPING",
     "description": "Each record links its Source value to its Target value, for example From. Nodes are the values of both"
    },
    {
     "name": "target",
     "title": "Target",
     "type": "GROUPING",
     "description": "The other end of each link, for example To"
    },
    {
     "name": "group",
     "title": "Node colour",
     "type": "GROUPING",
     "description": "Colours each node by this category of its Source records, for example Team. A node that only appears as a Target is grey"
    },
    {
     "name": "linkWidth",
     "title": "Link width",
     "type": "MEASURE",
     "description": "Thickness of each link, for example the sum of Messages. If empty, links are thin lines"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING",
     "description": "One graph per value, side by side"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING",
     "description": "One graph per value, one above the other"
    }
   ],
   "options": [
    {
     "name": "background",
     "title": "Background colour",
     "type": "TEXT",
     "description": "Any CSS colour, for example #ffffff or black. Empty or not a colour: white"
    }
   ],
   "outputs": [],
   "libraries": [
    "3d-force-graph 1.80.2"
   ],
   "relatedSummary": "The core **Force Graph** and **Network** views suit most networks. This view is for dense networks, where a third dimension gives the clusters room and turning the graph shows them from another side.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Force Graph",
     "page": null,
     "note": "The same force-directed layout of links in two dimensions, better integrated with the report. Use this view when a dense network needs the room of a third dimension."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "networkanalyser",
     "name": "Network Analyser",
     "page": "https://visokio.github.io/omniscope-custom-views/networkanalyser/index.html",
     "note": "Draws the same From and To links in 2D and analyses them: communities, centrality, shortest paths."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Network",
     "page": null,
     "note": "Draws networks in two dimensions with several layouts, better integrated with the report; it suits most networks."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/threeforcegraph/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/threeforcegraph",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/threeforcegraph/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/threeforcegraph/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/threeforcegraph/sample-data/messages.csv"
    ]
   }
  },
  {
   "id": "tilemap",
   "name": "Tile Map",
   "category": "Map",
   "categories": [
    "Map"
   ],
   "subcategory": null,
   "description": "Every region gets a fair share of the picture. One tile per US state or UK region, coloured by any measure and labelled with its value, for regional reporting that reads at a glance.",
   "tags": [
    "custom",
    "tile map",
    "map",
    "us states",
    "uk regions",
    "grid map",
    "choropleth",
    "regions",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "region",
     "title": "Regions",
     "type": "GROUPING",
     "description": "US states (names or two-letter codes), UK regions (names or ITL/NUTS codes), or your own codes with a Custom layout"
    },
    {
     "name": "value",
     "title": "Colour by",
     "type": "MEASURE",
     "description": "The measure that colours each tile"
    }
   ],
   "options": [
    {
     "name": "layout",
     "title": "Map",
     "type": "CHOICE",
     "description": "Automatic picks the layout that matches most regions"
    },
    {
     "name": "custom",
     "title": "Custom layout",
     "type": "TEXT",
     "description": "Your own grid: CODE:column,row separated by semicolons, optionally CODE:column,row:Full name"
    },
    {
     "name": "colour",
     "title": "Colours",
     "type": "CHOICE",
     "description": "Equal numbers per colour (quantiles) stop one large region from washing out the rest"
    },
    {
     "name": "midpoint",
     "title": "Midpoint",
     "type": "NUMBER",
     "description": "For diverging colours (default the median)"
    },
    {
     "name": "showValues",
     "title": "Show values",
     "type": "TOGGLE",
     "description": "Write the value in each tile"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view gives every US state or UK region, or each territory in a grid of your own, a tile of the same size labelled with its value, so every region can be read and compared, unlike on the core **Choropleth** map.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Choropleth",
     "page": null,
     "note": "Colours regions on a geographic map, where large regions dominate and small ones are hard to see."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "francechoropleth",
     "name": "France Choropleth",
     "page": "https://visokio.github.io/omniscope-custom-views/francechoropleth/index.html",
     "note": "French departments coloured on a geographic map."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/tilemap/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/tilemap",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/tilemap/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/tilemap/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/tilemap/sample-data/uk_regions.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/tilemap/sample-data/us_sales.csv"
    ]
   }
  },
  {
   "id": "tradingview",
   "name": "TradingView",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "A market chart for the symbol in your data. TradingView's Advanced Real-Time Chart, driven by the record the viewer filters or selects in the report.",
   "tags": [
    "trading",
    "stocks",
    "quotes",
    "finance",
    "crypto",
    "chart",
    "embed"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "aticker",
     "title": "Symbol",
     "type": "MEASURE"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING"
    }
   ],
   "options": [
    {
     "name": "interval",
     "title": "Bar interval",
     "type": "CHOICE"
    },
    {
     "name": "details",
     "title": "Show details panel",
     "type": "TOGGLE"
    },
    {
     "name": "o_darkMode",
     "title": "Dark mode",
     "type": "TOGGLE"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "This view is for when the data has symbols but not prices: TradingView supplies the market data, intervals and indicators, next to your own figures; for prices already in your data, use the core **Candlestick** view.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Candlestick",
     "page": null,
     "note": "Draws price bars from prices in your own data. This view shows TradingView's market data and tools for a symbol in your data."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Connectors/YahooFinance",
     "name": "Yahoo Finance",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Connectors/YahooFinance/index.html",
     "note": "Loads price history into the workflow, when you need the prices as data for your own calculations or charts."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/tradingview/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/tradingview",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/tradingview/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/tradingview/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/tradingview/sample-data/portfolio.csv"
    ]
   }
  },
  {
   "id": "transitions",
   "name": "Transition Matrix",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "Where did they go? See how customers, accounts or loans moved between tiers, segments or ratings from one period to the next, and who made each move.",
   "tags": [
    "custom",
    "transition matrix",
    "migration",
    "movement",
    "customer tiers",
    "credit rating",
    "segments",
    "churn",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "item",
     "title": "Items",
     "type": "FIELD",
     "description": "What moves between states, e.g. Customer, Account, Loan"
    },
    {
     "name": "period",
     "title": "Periods",
     "type": "FIELD",
     "description": "When the state was recorded, e.g. Year or Month"
    },
    {
     "name": "state",
     "title": "State",
     "type": "FIELD",
     "description": "The state in each period, e.g. Tier, Rating, Segment"
    }
   ],
   "options": [
    {
     "name": "from",
     "title": "From",
     "type": "TEXT",
     "description": "Optional: the earlier period as it appears in the data (default the second last)"
    },
    {
     "name": "to",
     "title": "To",
     "type": "TEXT",
     "description": "Optional: the later period (default the last)"
    },
    {
     "name": "order",
     "title": "Order",
     "type": "TEXT",
     "description": "The states best first, separated by commas (e.g. Platinum, Gold, Silver, Bronze), to count moves up and down"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view pairs two snapshots itself and shows the matrix of shares between states, with the share that stayed, moved up and moved down.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Sankey",
     "page": null,
     "note": "Flows from one state to another, without the matrix of shares."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pivot",
     "page": null,
     "note": "A cross-tab of states, once each item's two states are joined in the workflow."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/transitions/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/transitions",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/transitions/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/transitions/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/transitions/sample-data/customer_tiers.csv"
    ]
   }
  },
  {
   "id": "twitterview",
   "name": "Twitter View",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "The post behind the number. Embeds a post from X (formerly Twitter) in a report, chosen by the record the viewer filters or selects.",
   "tags": [
    "twitter",
    "tweet",
    "x",
    "post",
    "social media",
    "embed"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "atweetID",
     "title": "Post ID or URL",
     "type": "MEASURE"
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING"
    }
   ],
   "options": [
    {
     "name": "darkMode",
     "title": "Dark mode",
     "type": "TOGGLE"
    },
    {
     "name": "hideConversation",
     "title": "Hide conversation",
     "type": "TOGGLE"
    },
    {
     "name": "hideMedia",
     "title": "Hide photos and link previews",
     "type": "TOGGLE"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": null,
   "related": [],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/twitterview/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/twitterview",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/twitterview/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/twitterview/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/twitterview/sample-data/posts.csv"
    ]
   }
  },
  {
   "id": "uploadandexecute",
   "name": "Upload and Execute",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "Viewers upload a file from the report, and the workflow checks it, processes it and shows it.",
   "tags": [
    "custom",
    "lambda",
    "upload",
    "parameter",
    "param",
    "workflow",
    "job",
    "execute",
    "execution",
    "block",
    "api"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [],
   "options": [
    {
     "name": "block",
     "title": "Blocks to execute",
     "type": "TEXT",
     "description": "Names of the workflow blocks to execute, separated by commas, e.g. Load orders, Report. Leave empty to execute the whole workflow."
    },
    {
     "name": "buttonText",
     "title": "Button text",
     "type": "TEXT",
     "description": "Text on the button. If empty: Upload and execute"
    },
    {
     "name": "deleteExecutionOnFinish",
     "title": "Delete the copy when finished",
     "type": "TOGGLE",
     "description": "Delete the copy of the project, and its execution data, when the execution ends. Off: the copy is kept."
    },
    {
     "name": "paramName",
     "title": "File parameter",
     "type": "TEXT",
     "description": "Name of the project parameter that receives the uploaded file; link it to the File block's path. Default: uploadedFile."
    },
    {
     "name": "refreshThisReportOnFinish",
     "title": "Refresh this report when finished",
     "type": "TOGGLE",
     "description": "When the execution has finished, execute this report's block (from source) so the report shows what the execution wrote."
    },
    {
     "name": "showJobState",
     "title": "Show job state",
     "type": "TOGGLE",
     "description": "Show the execution's progress (queued, running, finished) under the button. Errors are always shown."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "This view is for data that arrives as files from people who should not edit the workflow: the viewer uploads a file and the workflow runs on it in a copy of the project.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "lambdaworkflowexecution",
     "name": "Lambda Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/lambdaworkflowexecution/index.html",
     "note": "Runs a copy of the project with typed parameter values instead of a file."
    },
    {
     "relation": "seeAlso",
     "kind": "coreBlock",
     "id": null,
     "name": "Validate data",
     "page": null,
     "note": "Checks the uploaded file against expected fields and values, and stops it if it fails."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/uploadandexecute/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/uploadandexecute",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/uploadandexecute/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/uploadandexecute/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/uploadandexecute/sample-data/new-orders.csv",
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/uploadandexecute/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "variancechart",
   "name": "Variance Chart",
   "category": "Bar",
   "categories": [
    "Bar"
   ],
   "subcategory": null,
   "description": "Actual against plan, at a glance. Sales against budget, costs against forecast, this year against last, with the variance in money and in percent and the total at the end, in the layout finance teams use in management reports.",
   "tags": [
    "custom",
    "variance",
    "budget",
    "plan",
    "actual",
    "forecast",
    "finance",
    "management reporting",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "category",
     "title": "Breakdown",
     "type": "GROUPING",
     "description": "Rows or periods to compare, e.g. Region, Product line or Month (dates are drawn as columns)"
    },
    {
     "name": "actual",
     "title": "Actual",
     "type": "MEASURE",
     "description": "The actual figure, e.g. sum of Sales"
    },
    {
     "name": "plan",
     "title": "Plan",
     "type": "MEASURE",
     "description": "What to compare against, e.g. sum of Budget, Forecast or Prior year"
    }
   ],
   "options": [
    {
     "name": "good",
     "title": "Above plan is",
     "type": "CHOICE",
     "description": "Decides which variances are green and which red"
    },
    {
     "name": "sort",
     "title": "Sort",
     "type": "CHOICE",
     "description": "Row order for categories; periods always stay in time order"
    },
    {
     "name": "topN",
     "title": "Rows shown",
     "type": "NUMBER",
     "description": "Further rows are combined as Other (default 15)"
    },
    {
     "name": "layout",
     "title": "Layout",
     "type": "CHOICE",
     "description": "Automatic draws periods as columns and categories as rows"
    },
    {
     "name": "showTotal",
     "title": "Show total",
     "type": "TOGGLE",
     "description": "Add a total row (only when both measures are sums or counts)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view puts actual, plan, absolute and percentage variance side by side for every row or period, in the layout of a management pack, with colours that swap for costs.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Comparison Bar",
     "page": null,
     "note": "Actual against a comparison value, one chart at a time."
    },
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Bullet",
     "page": null,
     "note": "Actual against target, one bar at a time."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "pvmbridge",
     "name": "Price Volume Mix",
     "page": "https://visokio.github.io/omniscope-custom-views/pvmbridge/index.html",
     "note": "Explains a change in revenue between two periods as price, volume and mix effects."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Variance-Bridge",
     "name": "Variance Bridge",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Variance-Bridge/index.html",
     "note": "Bridges the two totals category by category as waterfall steps, with favourable and adverse labels."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/variancechart/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/variancechart",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/variancechart/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/variancechart/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/variancechart/sample-data/sales_budget.csv"
    ]
   }
  },
  {
   "id": "venndiagram",
   "name": "Venn Diagram",
   "category": "Diagram",
   "categories": [
    "Diagram"
   ],
   "subcategory": null,
   "description": "How three conditions overlap, with the count in every region, and a click to select exactly the records in one of them.",
   "tags": [
    "custom",
    "subset"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "filterAField",
     "title": "Set A field",
     "type": "FIELD",
     "description": "Numeric field that defines set A, with its Min and Max"
    },
    {
     "name": "filterBField",
     "title": "Set B field",
     "type": "FIELD",
     "description": "Numeric field that defines set B, with its Min and Max"
    },
    {
     "name": "filterCField",
     "title": "Set C field",
     "type": "FIELD",
     "description": "Numeric field that defines set C, with its Min and Max"
    }
   ],
   "options": [
    {
     "name": "filterAMax",
     "title": "Set A max",
     "type": "TEXT",
     "description": "Set A holds the records whose value is at most this number. Leave empty for no upper limit"
    },
    {
     "name": "filterAMin",
     "title": "Set A min",
     "type": "TEXT",
     "description": "Set A holds the records whose value is above this number (not equal to it). Leave empty for no lower limit"
    },
    {
     "name": "filterBMax",
     "title": "Set B max",
     "type": "TEXT",
     "description": "Set B holds the records whose value is at most this number. Leave empty for no upper limit"
    },
    {
     "name": "filterBMin",
     "title": "Set B min",
     "type": "TEXT",
     "description": "Set B holds the records whose value is above this number (not equal to it). Leave empty for no lower limit"
    },
    {
     "name": "filterCMax",
     "title": "Set C max",
     "type": "TEXT",
     "description": "Set C holds the records whose value is at most this number. Leave empty for no upper limit"
    },
    {
     "name": "filterCMin",
     "title": "Set C min",
     "type": "TEXT",
     "description": "Set C holds the records whose value is above this number (not equal to it). Leave empty for no lower limit"
    },
    {
     "name": "setAName",
     "title": "Set A name",
     "type": "TEXT",
     "description": "Name shown for set A. If empty, the field name is shown"
    },
    {
     "name": "setBName",
     "title": "Set B name",
     "type": "TEXT",
     "description": "Name shown for set B. If empty, the field name is shown"
    },
    {
     "name": "setCName",
     "title": "Set C name",
     "type": "TEXT",
     "description": "Name shown for set C. If empty, the field name is shown"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 4.13.0"
   ],
   "relatedSummary": "Report filters can pick out any combination of three conditions, but not show how big each overlap is. This view counts all seven regions and selects any one of them with a click.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "quadrant",
     "name": "Quadrant Matrix",
     "page": "https://visokio.github.io/omniscope-custom-views/quadrant/index.html",
     "note": "Splits items into four quadrants by two measures, with each quadrant selectable."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "rfmsegments",
     "name": "RFM Segments",
     "page": "https://visokio.github.io/omniscope-custom-views/rfmsegments/index.html",
     "note": "Scores customers on recency, frequency and spend from transactions, into named segments."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/venndiagram/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/venndiagram",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/venndiagram/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/venndiagram/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/venndiagram/sample-data/customers.csv"
    ]
   }
  },
  {
   "id": "waffle",
   "name": "Waffle Chart",
   "category": "Diagram",
   "categories": [
    "Diagram"
   ],
   "subcategory": null,
   "description": "Shares you can count. Part-to-whole as 100 squares, alone or side by side, for summaries that read in a second.",
   "tags": [
    "custom",
    "waffle",
    "part to whole",
    "share",
    "percentage",
    "infographic",
    "proportion",
    "small multiples",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "category",
     "title": "Parts",
     "type": "GROUPING",
     "description": "The parts of the whole, e.g. Source, Category, Segment"
    },
    {
     "name": "value",
     "title": "Size",
     "type": "MEASURE",
     "description": "The measure that sizes each part, e.g. sum of Generation"
    },
    {
     "name": "pane",
     "title": "One waffle per",
     "type": "GROUPING",
     "description": "Optional: small multiples, e.g. one waffle per Nation (up to 12)"
    }
   ],
   "options": [
    {
     "name": "maxParts",
     "title": "Parts shown",
     "type": "NUMBER",
     "description": "Further parts are combined as Other (default 6)"
    },
    {
     "name": "grid",
     "title": "Squares",
     "type": "CHOICE",
     "description": "Grid size"
    },
    {
     "name": "shape",
     "title": "Shape",
     "type": "CHOICE"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Pie** view shows the mix as angles, which are hard to compare. This view lays the mix out as 100 squares, so shares can be counted and several groups compared side by side; it is mainly a presentation choice.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pictorial",
     "page": null,
     "note": "Fills an icon in proportion to each part, stacked by a field. Use it for a picture of the mix; use this view when shares should be countable and several groups compared side by side."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Pictogram",
     "page": null,
     "note": "Repeated images in place of bars, one row per category."
    },
    {
     "relation": "seeAlso",
     "kind": "coreView",
     "id": null,
     "name": "Pie",
     "page": null,
     "note": "Part-to-whole as slices, harder to read exactly."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/waffle/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/waffle",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/waffle/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/waffle/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/waffle/sample-data/energy_mix.csv"
    ]
   }
  },
  {
   "id": "web",
   "name": "Web View",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "A web page inside a report, chosen by the data: the page whose address is in the record the viewer filters or selects.",
   "tags": [
    "custom",
    "web",
    "webpage",
    "www",
    "url",
    "browser",
    "embed",
    "iframe"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [
    {
     "name": "measures",
     "title": "Page URL",
     "type": "MEASURE",
     "description": "The field with the web addresses to show. Some sites do not allow being shown inside another page and stay blank: use Open in a new tab."
    },
    {
     "name": "paneX",
     "title": "Pane X",
     "type": "GROUPING"
    },
    {
     "name": "paneY",
     "title": "Pane Y",
     "type": "GROUPING"
    }
   ],
   "options": [
    {
     "name": "showBar",
     "title": "Show address bar",
     "type": "TOGGLE"
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "This view shows a whole web page, chosen by an address in the data, next to the records that point to it.",
   "related": [
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "customhtml",
     "name": "Custom HTML",
     "page": "https://visokio.github.io/omniscope-custom-views/customhtml/index.html",
     "note": "Shows HTML typed into the settings or held in the data, such as a widget's embed snippet."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/web/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/web",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/web/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/web/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/web/sample-data/offices.csv"
    ]
   }
  },
  {
   "id": "weeklypattern",
   "name": "Weekly Pattern",
   "category": "Table",
   "categories": [
    "Table"
   ],
   "subcategory": null,
   "description": "When are you busiest? See the week at a glance, hour by hour, from any timestamped data, and plan staff, capacity and campaigns around it.",
   "tags": [
    "custom",
    "heatmap",
    "day of week",
    "hour of day",
    "weekly pattern",
    "staffing",
    "capacity",
    "punch card",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "time",
     "title": "Timestamps",
     "type": "FIELD",
     "description": "Date and time of each record, e.g. call received, order placed, visit started"
    },
    {
     "name": "value",
     "title": "Measure",
     "type": "MEASURE",
     "description": "Optional: what to count or add up per hour (default: number of records)"
    }
   ],
   "options": [
    {
     "name": "show",
     "title": "Show",
     "type": "CHOICE",
     "description": "Average per week makes periods of different lengths comparable"
    },
    {
     "name": "utcOffset",
     "title": "Shift hours",
     "type": "NUMBER",
     "description": "Shift all times by this many hours, e.g. to convert UTC to local time (default 0)"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "This view builds the weekly pattern straight from timestamps, as averages per week, with no derived fields.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Pivot",
     "page": null,
     "note": "Weekday by hour, once those fields are derived in the workflow."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "calendar",
     "name": "Calendar",
     "page": "https://visokio.github.io/omniscope-custom-views/calendar/index.html",
     "note": "A time grid coloured by a measure, by day of the year rather than weekday and hour."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/weeklypattern/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/weeklypattern",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/weeklypattern/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/weeklypattern/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/weeklypattern/sample-data/contacts.csv"
    ]
   }
  },
  {
   "id": "workflowexecution",
   "name": "Workflow Execution",
   "category": "Tool",
   "categories": [
    "Tool"
   ],
   "subcategory": null,
   "description": "A button in the report that runs the workflow behind it. Viewers refresh the data, or run an export, without opening the workflow.",
   "tags": [
    "custom",
    "workflow",
    "job",
    "execute",
    "execution",
    "block",
    "api"
   ],
   "aiBuilt": false,
   "language": null,
   "inputs": [],
   "options": [
    {
     "name": "block",
     "title": "Blocks to execute",
     "type": "TEXT",
     "description": "Names of the workflow blocks to execute, separated by commas, e.g. Load orders, Report. Leave empty to execute the whole workflow."
    },
    {
     "name": "buttonText",
     "title": "Button text",
     "type": "TEXT",
     "description": "Text on the button. If empty: Execute"
    },
    {
     "name": "refreshFromSource",
     "title": "Refresh from source",
     "type": "TOGGLE",
     "description": "On: the blocks reload their data from the sources. Off: data already loaded upstream is reused where possible."
    },
    {
     "name": "showJobState",
     "title": "Show job state",
     "type": "TOGGLE",
     "description": "Show the execution's progress (queued, running, finished) under the button. Errors are always shown."
    }
   ],
   "outputs": [],
   "libraries": [],
   "relatedSummary": "This view is the simplest of those that act on the workflow from a report: a button that executes named blocks.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "sequentialworkflowexecution",
     "name": "Sequential Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/sequentialworkflowexecution/index.html",
     "note": "Executes the blocks one at a time in the order given, stopping at a failure. Use it when steps with side effects must run in a set order; this view lets Omniscope order them by their connections."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "setparamandexecute",
     "name": "Set Parameters and Execute",
     "page": "https://visokio.github.io/omniscope-custom-views/setparamandexecute/index.html",
     "note": "Adds inputs for project parameters, sent with the execution. Use it when viewers should change values before running."
    },
    {
     "relation": "overlaps",
     "kind": "view",
     "id": "lambdaworkflowexecution",
     "name": "Lambda Workflow Execution",
     "page": "https://visokio.github.io/omniscope-custom-views/lambdaworkflowexecution/index.html",
     "note": "Executes in a new copy of the project with typed parameter values, so viewers don't wait for or overwrite each other."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "switchparamandexecute",
     "name": "Switch Param and Execute Workflow",
     "page": "https://visokio.github.io/omniscope-custom-views/switchparamandexecute/index.html",
     "note": "Sets one parameter from a list of values, then executes."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "switchparam",
     "name": "Switch Param",
     "page": "https://visokio.github.io/omniscope-custom-views/switchparam/index.html",
     "note": "Sets a parameter without executing; pair it with this button."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Preparation/Conditional Execution",
     "name": "Conditional Execution",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Preparation/Conditional%20Execution/index.html",
     "note": "Starts a run of chosen blocks from inside the workflow, when a yes/no option is on."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/workflowexecution/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/workflowexecution",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/workflowexecution/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/workflowexecution/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/workflowexecution/sample-data/orders.csv"
    ]
   }
  },
  {
   "id": "yearonyear",
   "name": "Year on Year",
   "category": "Line and scatter",
   "categories": [
    "Line and scatter"
   ],
   "subcategory": null,
   "description": "Are we ahead of last year? This year against previous years, month by month, with a like-for-like year-to-date figure and financial years that start when yours do.",
   "tags": [
    "custom",
    "year on year",
    "yoy",
    "year to date",
    "ytd",
    "seasonal comparison",
    "financial year",
    "trend",
    "visokio-agents"
   ],
   "aiBuilt": true,
   "language": null,
   "inputs": [
    {
     "name": "date",
     "title": "Dated by",
     "type": "FIELD",
     "description": "The date of each record, e.g. Order date"
    },
    {
     "name": "value",
     "title": "Measure",
     "type": "MEASURE",
     "description": "What to compare, e.g. sum of Revenue (default: number of records)"
    }
   ],
   "options": [
    {
     "name": "period",
     "title": "Period",
     "type": "CHOICE",
     "description": "Size of each point (default month)"
    },
    {
     "name": "mode",
     "title": "Show",
     "type": "CHOICE",
     "description": "Values per period, or cumulative through the year"
    },
    {
     "name": "years",
     "title": "Years shown",
     "type": "NUMBER",
     "description": "Number of most recent years drawn (default 3)"
    },
    {
     "name": "fiscalStart",
     "title": "Year starts in month",
     "type": "NUMBER",
     "description": "1 for calendar years, 4 for a UK financial year starting in April"
    }
   ],
   "outputs": [],
   "libraries": [
    "d3 7.9.0"
   ],
   "relatedSummary": "The core **Timeseries Multi-Line** view can overlay years once a month-of-year field is derived. This view handles the details that make the comparison fair: financial years, an incomplete current period and like-for-like year to date.",
   "related": [
    {
     "relation": "overlaps",
     "kind": "coreView",
     "id": null,
     "name": "Timeseries Multi-Line",
     "page": null,
     "note": "Several lines over time; overlaying years needs a derived month field."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "runningpivot",
     "name": "Running Pivot View",
     "page": "https://visokio.github.io/omniscope-custom-views/runningpivot/index.html",
     "note": "Running totals by period for several columns, as a table."
    },
    {
     "relation": "seeAlso",
     "kind": "view",
     "id": "calendar",
     "name": "Calendar",
     "page": "https://visokio.github.io/omniscope-custom-views/calendar/index.html",
     "note": "Daily values laid out year by year."
    },
    {
     "relation": "seeAlso",
     "kind": "block",
     "id": "Analytics/Period-Comparison",
     "name": "Period Comparison",
     "page": "https://visokio.github.io/omniscope-custom-blocks/Analytics/Period-Comparison/index.html",
     "note": "The month, QTD, YTD and moving annual total comparison table, per group, with a fiscal year start of your choice."
    }
   ],
   "links": {
    "page": "https://visokio.github.io/omniscope-custom-views/yearonyear/index.html",
    "source": "https://github.com/visokio/omniscope-custom-views/tree/going-public/yearonyear",
    "demoIoz": "https://github.com/visokio/omniscope-custom-views/raw/going-public/yearonyear/demo.ioz",
    "demoServer": "https://public.omniscope.me/Community/Views/yearonyear/demo.iox/",
    "sampleData": [
     "https://github.com/visokio/omniscope-custom-views/raw/going-public/yearonyear/sample-data/orders_daily.csv"
    ]
   }
  }
 ]
}
