{
  "nodes": [
    {
      "ID": "Core Concept-mindshare",
      "name": "Mindshare",
      "type": "Core Concept",
      "properties": {
        "Area": "Overview"
      },
      "size": 5,
      "position": {
        "x": 0,
        "y": 0,
        "z": 0.01
      },
      "description": "Mindshare is a web app for turning knowledge into one interactive graph: every idea becomes a node, every relationship a named link, and every detail lives inside the node instead of cluttering the picture. A person starts on the start page with a use case, a template, their own JSON or a program sending through the APIs; Mindshare draws the graph on a 2D canvas where nodes carry a type with its own shape and colour, a size, a position and any number of typed properties.\n\nReaders explore by pointing, clicking and flying from node to node, open the Detail panel to read descriptions, pictures and connections, and use search, filters and the legend to cut a large graph down to the part that matters. Authors shape the graph in place: they add and edit nodes and links, define node types, arrange nodes with layout strategies, act on many nodes at once with zones and saved selections, and undo any step.\n\nPersist on server gives the graph its own address, optionally protected by a password, that can be shared as a plain link or as a link to the current view, and Download takes the whole graph as JSON. Pictures are stored by the server's Media Module and referenced by ID, so the same screenshot can appear in many nodes and graphs. The result is a graph that explains a subject at a glance and still holds every detail one click away."
    },
    {
      "ID": "Core Concept-0",
      "name": "Node",
      "type": "Core Concept",
      "properties": {
        "Area": "Overview"
      },
      "size": 3.9681238188423755,
      "position": {
        "x": 18.3276,
        "y": -19.7833,
        "z": 0.01
      },
      "description": "A node is the main building block of a Mindshare graph: whenever an idea, a thing or a person needs a place on the canvas, it becomes a node. Each node has an ID that never changes, a name drawn inside its shape, a type that decides its shape and colour, a size, a position and a description, and it can carry typed properties and pictures.\n\nBecause everything about an idea is gathered in one node, the canvas stays readable while the full information is one click away in the Detail panel."
    },
    {
      "ID": "Core Concept-1",
      "name": "Link",
      "type": "Core Concept",
      "properties": {
        "Area": "Links"
      },
      "size": 4,
      "position": {
        "x": 25.3644,
        "y": -9.2545,
        "z": 0.01
      },
      "description": "A link is the line between two nodes that records how they are related. When a person connects two ideas, the link can carry one name that reads both ways or two names, one from each side, so each node's Detail panel tells the relationship in its own words.\n\nLinks can show arrows, carry their own properties or stay hidden on the canvas while still being listed in the Detail panel, and all of this can be changed later in Edit link. Reading a graph is mostly following links, so well-named links turn a picture of dots into an explanation."
    },
    {
      "ID": "Core Concept-3",
      "name": "Properties",
      "type": "Core Concept",
      "properties": {
        "Area": "Properties"
      },
      "size": 2.5,
      "position": {
        "x": -2.6048,
        "y": 25.3666,
        "z": 0.01
      },
      "description": "Properties hold the extra facts a node or link needs beyond its name and description, such as a date, a status, a score or a category. A person defines a property by giving it a name and one of eight data types, and every node of a type then carries the same properties in the same order.\n\nTyped properties are what make filtering precise: a number gets a range slider, a date gets a From/To picker, a list gets pick-values, so readers can narrow a graph by real data instead of by text."
    },
    {
      "ID": "Core Concept-4",
      "name": "Metadata",
      "type": "Core Concept",
      "properties": {
        "Area": "Data and integration"
      },
      "size": 2.5,
      "position": {
        "x": 21.4975,
        "y": 23.7035,
        "z": 0
      },
      "description": "Metadata is the part of a graph's data that describes the graph itself rather than its nodes: the data type of every property, the look of every node type, the Detail settings that decide which properties show where, and an optional source link.\n\nWhoever writes or imports a graph sets these once, and Mindshare applies them to every node of the matching type. Because the rules live in one place, a whole graph changes its look or its Detail panels by editing a single entry instead of every node."
    },
    {
      "ID": "Core Concept-5",
      "name": "Visuals",
      "type": "Core Concept",
      "properties": {
        "Area": "Node types and look"
      },
      "size": 2.5,
      "position": {
        "x": -14.5255,
        "y": -20.9585,
        "z": 0.01
      },
      "description": "Visuals decide how a node looks on the canvas. A node's type picks its shape and its colour, while each node keeps its own size and position, so one glance tells the reader what kind of thing a node is and how important it is.\n\nMindshare offers circles, rectangles, hexagons, stars, polygons with 5 to 20 sides and pictures placed on the canvas; nodes are white inside and the type colour draws the border, the rings and the glow. Choosing distinct shapes and colours per type lets people read a large graph before reading a single label."
    },
    {
      "ID": "Core Concept-6",
      "name": "Tools",
      "type": "Core Concept",
      "properties": {
        "Area": "Overview"
      },
      "size": 2.5,
      "position": {
        "x": 25.8189,
        "y": -20.552,
        "z": 0.01
      },
      "description": "Tools are the controls that change how a graph is shown and worked on without changing what it says.\n\nWhen a reader needs to see less, the toolbars offer search, filters, the legend, node opacity, Fill small nodes, saved selections and glow; when an author needs to reorganise, the left toolbar offers zones, copy properties, arrange nodes, movements, snapping and a grid, and the top toolbar adds undo, history, Persist on server, Share and Download. Knowing where each tool sits turns Mindshare from a viewer into a workbench."
    },
    {
      "ID": "Core Concept-7",
      "name": "Detail",
      "type": "Core Concept",
      "properties": {
        "Area": "Detail panel"
      },
      "size": 2.5,
      "position": {
        "x": 29.3447,
        "y": -3.023,
        "z": 0.01
      },
      "description": "The Detail panel is the inside of a node. When a reader clicks a node, the panel docks on the right and shows its name, type, description, chosen properties, gallery and every connected node, grouped by type and introduced by the link's name from this node's side.\n\nClicking a connection flies the canvas to that node and opens its own panel, so a reader can walk through a whole subject panel by panel. Keeping the detail here is what lets the canvas stay clean."
    },
    {
      "ID": "Core Concept-8",
      "name": "Canvas",
      "type": "Core Concept",
      "properties": {
        "Area": "Navigation"
      },
      "size": 2.5,
      "position": {
        "x": 8.2146,
        "y": -27.8122,
        "z": 0.01
      },
      "description": "The canvas is the main area where the graph is drawn. It is framed by the top toolbar, the left toolbar, panels that dock on the right and toolboxes that dock along the bottom, and it has no edges: a person zooms and pans to wherever the graph extends.\n\nNodes sit at their stored positions with Y growing upwards, and links are drawn straight between them. Everything a reader explores and everything an author arranges happens on this one surface."
    },
    {
      "ID": "Core Concept-9",
      "name": "Media",
      "type": "Core Concept",
      "properties": {
        "Area": "Pictures"
      },
      "size": 2.5,
      "position": {
        "x": 22.7091,
        "y": 11.5994,
        "z": 0.01
      },
      "description": "Media brings pictures and videos into a graph. When a node is better explained by a screenshot, a diagram or a demo, a person adds pictures to its gallery, chooses one as the node's cover, or places a picture directly on the canvas as its own node; YouTube videos can sit in a gallery too.\n\nPictures are stored once by the Media Module and referenced by ID, so they load fast and can be reused. A graph with the right pictures explains at a glance what text alone would take paragraphs to say.",
      "features": {
        "resizeTextToFit": true
      }
    },
    {
      "ID": "Core Concept-10",
      "name": "Filters",
      "type": "Core Concept",
      "properties": {
        "Area": "Filtering"
      },
      "size": 2.5,
      "position": {
        "x": -11.792,
        "y": 22.6097,
        "z": 0.01
      },
      "description": "Filters let a reader keep only the nodes that meet a condition and fade the rest. When a graph is too big to read at once, the person builds a filter on a node type, a property, the name or the description, or on link properties, and combines filters with AND and OR or groups them into filter sets.\n\nA saved selection can act as a filter too. Filtered-out nodes are not removed, only faded, so the context stays visible. Filters live in the session and in a share link to the view, never in the persisted graph, so trying them changes nothing for anyone else."
    },
    {
      "ID": "Core Concept-11",
      "name": "JSON",
      "type": "Core Concept",
      "properties": {
        "Area": "Data and integration"
      },
      "size": 1.6295404414039094,
      "position": {
        "x": 18.8722,
        "y": 15.8257,
        "z": 0
      },
      "description": "JSON is the text format that holds a whole Mindshare graph: its data types, nodes, links, visuals, Detail settings and source link. A person or a program writes it, pastes it into the Your data box on the start page or loads it as a local file, and gets it back from Download in exactly the same shape, so a graph can be kept, versioned and edited outside the app.\n\nBecause every aspect of the graph is in this one file, it can be stored locally, generated by scripts or AI tools and imported again at any time."
    },
    {
      "ID": "Core Concept-layout",
      "name": "Layout",
      "type": "Core Concept",
      "properties": {
        "Area": "Layout"
      },
      "size": 2.5,
      "position": {
        "x": -25.4923,
        "y": 0.626,
        "z": 0.01
      },
      "description": "Layout is how nodes are placed on the canvas, and it decides how a graph reads. When a graph grows, the person arranges it with the left toolbar: snapping and a grid while dragging, align and distribute for a few selected nodes, Arrange nodes with eight strategies for many at once, and Movements to replay an arrangement in front of an audience.\n\nEvery arrangement can be undone and the resulting positions are persisted with the graph, so a heap of imported nodes becomes clusters, rows and rings that show the structure."
    },
    {
      "ID": "Core Concept-zones",
      "name": "Zones",
      "type": "Core Concept",
      "properties": {
        "Area": "Zones"
      },
      "size": 2.5,
      "position": {
        "x": -19.7719,
        "y": 16.1035,
        "z": 0.01
      },
      "description": "Zones are coloured rectangles on the canvas that do something to the nodes dropped into them. When many nodes need the same change, need to stay together or need to be moved elsewhere, the person opens Zones on the left toolbar, picks a Transform, Container or Portal zone and clicks once for the usual size or drags to draw one, or presses Shift+Z for one in the middle of the view.\n\nEach has a name, a colour and its own settings, and a grip, a resize handle and a cross on it. Zones pan and zoom with the graph, and one can be docked to stay within reach. They are forgotten on reload, but the changes they make to nodes are persisted and can be undone, so they work as temporary tools on a lasting graph."
    },
    {
      "ID": "Core Concept-history",
      "name": "History",
      "type": "Core Concept",
      "properties": {
        "Area": "History"
      },
      "size": 2.5,
      "position": {
        "x": 31.6296,
        "y": -19.1982,
        "z": 0.01
      },
      "description": "History records the changes a person makes so they can be taken back. Creating, moving, resizing, editing, duplicating and deleting nodes, link changes, node type changes, aligning, arranging, Copy properties and zone changes to a node's properties are all steps. Filters, opening, closing and docking a zone, saving a selection as a toolbox, Persist on server, Download and adding a picture are not.\n\nThe History button opens the list in the right dock, newest first with an Initial state row, and a click jumps to any step; Clear empties the list after asking. Because almost any step can be reversed, people can try layouts and edits freely. History lasts only while the page is open, and older steps drop off when the list is full."
    },
    {
      "ID": "Core Concept-media-module",
      "name": "Media Module",
      "type": "Core Concept",
      "properties": {
        "Area": "Pictures"
      },
      "size": 2.5,
      "position": {
        "x": 25.1847,
        "y": 3.9975,
        "z": 0.01
      },
      "description": "The Media Module is the picture storage built into every Mindshare server. When a person adds a picture in the app, the module stores the file, keeps smaller versions for fast loading and returns a picture ID; the graph stores only that ID.\n\nWherever the graph is opened on the same server the picture appears again, and the server records which graphs use which pictures so its owner can clean up unused ones. On a server where the module is switched off, the picture buttons are hidden and stored pictures show a placeholder, while graphs still open and persist."
    },
    {
      "ID": "Core Concept-keyboard-shortcuts",
      "name": "Keyboard shortcuts",
      "type": "Core Concept",
      "properties": {
        "Area": "Navigation"
      },
      "size": 2.5,
      "position": {
        "x": 2.9666,
        "y": -25.3268,
        "z": 0.01
      },
      "description": "Most actions have a key, and learning a handful makes building a graph much faster: Cmd/Ctrl-click adds a node or links two nodes, Alt-click edits, Shift-click and Shift-drag select, R resizes, Delete removes, holding L selects a link, Shift+Z places a zone, the Alt-letter keys align and distribute, Cmd/Ctrl+Shift+I adds a picture, Cmd/Ctrl+S persists, Cmd/Ctrl+Z undoes and Escape closes the top panel.\n\nEvery toolbar button has its own key too, and right-click menus show the shortcut beside each item, so the keys can be learned while working. Most shortcuts do not fire while the cursor is in a text field or a dialog is open. The connections of this node are hidden links: they are not drawn on the canvas but are listed here, underlined."
    },
    {
      "ID": "Capability-13",
      "name": "Interactive navigation",
      "type": "Capability",
      "properties": {
        "Area": "Overview"
      },
      "size": 2.5,
      "position": {
        "x": -8.0386,
        "y": -5.9482,
        "z": 0.01
      },
      "description": "Hovering over a node lights up the ideas linked to it, and following directional links feels like tracing a train of thought. With search, filters and opacity a reader reveals exactly the right information at the right moment, and double-clicking or clicking a connection flies the canvas to the next idea.\n\nThe graph is not a static picture but a dynamic interface for thinking, so people explore a subject in the order their questions arise."
    },
    {
      "ID": "Capability-14",
      "name": "Custom data model",
      "type": "Capability",
      "properties": {
        "Area": "Overview"
      },
      "size": 2.5,
      "position": {
        "x": 8.0386,
        "y": 5.9482,
        "z": 0.01
      },
      "description": "Every node and link can carry a name, a description, a type and custom properties such as text, lists, numbers, percentages, dates, durations and yes/no values.\n\nMindshare lets a person define their own semantic structure for whatever they want to visualise, in the Node Types manager or in the data, and as needs evolve the data model evolves with them without any coding. The same tool therefore serves a process map, a course, a project plan or a game."
    },
    {
      "ID": "Capability-15",
      "name": "Information encapsulation",
      "type": "Capability",
      "properties": {
        "Area": "Overview"
      },
      "size": 2.5,
      "position": {
        "x": 9.1706,
        "y": -3.9875,
        "z": 0.01
      },
      "description": "When a reader clicks a node, the Detail panel opens with its description, pictures and videos, properties and the named links to related ideas. Encapsulating information inside nodes and links keeps the graph clean and focused, while rich information stays available whenever it is needed, so one canvas can hold a large body of knowledge without overwhelming anyone."
    },
    {
      "ID": "Capability-16",
      "name": "Clarity and traceability",
      "type": "Capability",
      "properties": {
        "Area": "Overview"
      },
      "size": 2.5,
      "position": {
        "x": 1.132,
        "y": -9.9357,
        "z": 0.01
      },
      "description": "Even the most complicated information space becomes manageable with Mindshare. Relationships are drawn and named, concepts stay connected, and metadata brings order to the knowledge, so it is easy to trace where everything fits and why it matters. A reader who follows a link always learns what the relationship is, which turns a diagram into an argument that can be checked."
    },
    {
      "ID": "Capability-17",
      "name": "Compatibility and Control",
      "type": "Capability",
      "properties": {
        "Area": "Overview"
      },
      "size": 2.5,
      "position": {
        "x": -1.132,
        "y": 9.9357,
        "z": 0.01
      },
      "description": "Information can be visualised in the browser tab only, or persisted on the Mindshare server, with an optional password, so others can reach it by address. The import check runs in the browser and nothing reaches the server until the person presses Persist on server.\n\nGraph creation and updates can be automated by connecting through the APIs, and graphs can be prepared outside the app as JSON before they are visualised. People therefore keep full control over where their knowledge lives and how it is produced."
    },
    {
      "ID": "Capability-18",
      "name": "Visualisation of AI Outputs",
      "type": "Capability",
      "properties": {
        "Area": "Overview"
      },
      "size": 2.5,
      "position": {
        "x": -9.1706,
        "y": 3.9875,
        "z": 0.01
      },
      "description": "AI-generated data can be turned into a visualisation quickly with the Mindshare Claude agent. A person explains what is important to them, and the agent guides them through options for an efficient and comprehensive visualisation and produces the graph data that Mindshare imports. Output that would otherwise be a long text becomes a graph whose structure can be explored and checked."
    },
    {
      "ID": "Feature-54",
      "name": "Import",
      "type": "Feature",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 3.7278,
        "y": 23.9551,
        "z": 0.01
      },
      "description": "Import is how a graph gets into Mindshare. On the start page a person pastes JSON into the Your data box, or chooses Local File or drops a file on the box so its contents appear there, and then chooses Visualize; the graph opens on the canvas.\n\nThe check runs in the browser, so a broken graph never reaches the server and nothing is stored until Persist on server. Every import opens a new graph in the tab and never replaces an existing one."
    },
    {
      "ID": "UI-landing-page",
      "name": "Start page",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 4.1871,
        "y": 43.8003,
        "z": 0.01
      },
      "description": "The start page is where every graph begins. Opened at the app's home address, it reads Four ways to start a knowledge graph and offers a featured use case, a list of use cases, template cards, the API tile and the Your data box.\n\nA person explores a finished example, starts from a pattern, sends graphs from a program or brings their own data, and the blue M in the title panel leads back here from any graph."
    },
    {
      "ID": "Feature-automatic-first-arrangement",
      "name": "Automatic first arrangement",
      "type": "Feature",
      "properties": {
        "Area": "Getting in",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 2.9511,
        "y": 36.6313,
        "z": 0.01
      },
      "description": "When an imported graph carries no positions, one loading animation shows in the middle of the window while Mindshare places the nodes on rings, the best-connected node in the centre. A graph written by hand or by another program therefore needs no coordinates to be readable.\n\nThe decision is taken from the first node only: if it has a position, nothing is arranged and any other node without one lands at the centre, so positions are given to all nodes or to none. The computed places are kept and stored by the next persist; this first layout ignores node size, so big nodes can overlap until rearranged."
    },
    {
      "ID": "Feature-model-name",
      "name": "Graph name",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Title panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 11.2793,
        "y": 19.4686,
        "z": 0.01
      },
      "description": "A graph takes its first name the moment it opens: from the file's name without .json, as Pasted graph for pasted text, or as Example graph for the unchanged example. A graph without a real name is called Untitled graph. The person clicks the name in the title panel, chooses Edit, and can change the name and description; a name can be up to 200 characters.\n\nA new name stays in the tab until the next persist and Undo does not take it back. The name appears in the address, where spaces show as hyphens, and in the browser tab as the name followed by Mindshare, and a link made with an old name still opens the graph."
    },
    {
      "ID": "Feature-opening-a-saved-model",
      "name": "Opening a persisted graph",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 12.8731,
        "y": 31.4688,
        "z": 0.01
      },
      "description": "After the first persist a graph lives at its own address, /visualization followed by its ID and name, and that address or a shared link is the only way back in: the app shows no list of graphs and the server refuses to list them.\n\nPeople therefore keep the address the way they keep a document link. Spaces in the name show as hyphens, and old links keep working. Opening the canvas after a reload without an address shows No data available, because a graph that was never persisted is gone."
    },
    {
      "ID": "UI-25",
      "name": "Top toolbar",
      "type": "UI",
      "properties": {
        "Area": "Navigation",
        "Where": "Top toolbar",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 8.3073,
        "y": 54.5003,
        "z": 0.01
      },
      "description": "The top toolbar sits along the top edge and holds the controls for finding, adding and keeping things. From left to right it offers Search, Filters and Add picture, the last only where the server stores pictures, then Undo, History and Redo, then Persist on server, Share and Download. Because the most frequent commands sit in one row, a reader and an author reach them without leaving the canvas."
    },
    {
      "ID": "UI-22",
      "name": "Left toolbar",
      "type": "UI",
      "properties": {
        "Area": "Navigation",
        "Where": "Left toolbar",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -49.4061,
        "y": -9.2385,
        "z": 0.01
      },
      "description": "The left toolbar sits on the left edge and holds the tools that act on the look and placement of the graph. From top to bottom it offers Zones, Copy properties, Arrange nodes and Movements, then, after a divider, Snap to node guides, Show grid, Node Opacity, Fill small nodes, Glow and Legend.\n\nButtons that open a small side panel close each other and close on a click elsewhere, except Zones while a zone type is chosen, and the Legend stays independent; this keeps the canvas free even with several tools in use."
    },
    {
      "ID": "UI-right-dock",
      "name": "Right dock",
      "type": "UI",
      "properties": {
        "Area": "Navigation",
        "Where": "Right dock",
        "Shortcut": "Escape",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": -21.3643,
        "z": 0.01
      },
      "description": "Whenever a person opens Detail, Edit node, Add new node, Edit link, Detail settings, Node Types, zone settings or History, the window docks on the right edge of the screen.\n\nThe newest window sits on top and the ones beneath fade back and ignore clicks, so the person always works in one window without losing the others. Escape closes only the top window and pressing it again closes the next, which makes stepping back through panels quick."
    },
    {
      "ID": "UI-bottom-dock",
      "name": "Bottom dock",
      "type": "UI",
      "properties": {
        "Area": "Navigation",
        "Where": "Bottom dock",
        "Shortcut": "",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -1.0785,
        "y": -52,
        "z": 0.01
      },
      "description": "The bottom dock holds small toolboxes side by side along the bottom centre of the screen: the Copy properties toolbox, Movement bars, saved selections and zones the person has docked. Tools that act on many nodes stay out of the way of the graph and of the panels on the right, and a full row scrolls sideways."
    },
    {
      "ID": "UI-context-menus",
      "name": "Context menus",
      "type": "UI",
      "properties": {
        "Area": "Editing",
        "Where": "Right-click menu",
        "Shortcut": "right-click",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 14.3361,
        "y": -24.9206,
        "z": 0.01
      },
      "description": "When a person right-clicks, Mindshare offers the actions that fit the spot. On a node: Edit node, Add link, Duplicate node, Align and Distribute when several nodes are selected, Send to zone when Transform zones exist, Resize, which reads Zoom in to resize on a filled node, Add to selection and Delete node. On a link: Edit link, Direction, Hide link and Delete link, under a title naming both nodes.\n\nOn empty canvas: Create node here and Add image. Items show their shortcut, so the menu doubles as a way to learn the keys, and Escape or a click outside closes it. A right-click with a drag pans instead, so the same button serves both."
    },
    {
      "ID": "Feature-38",
      "name": "Mouse actions",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 4.9878,
        "y": -34.1375,
        "z": 0.01
      },
      "description": "Nodes come alive when a person works with the mouse. Pointing, clicking, double-clicking, dragging and right-clicking each do one thing on the canvas, and a held Shift, Alt, Cmd/Ctrl or L key turns a click into selecting, editing, creating or picking a link. Because the whole graph can be explored and edited this way, most work never needs a menu."
    },
    {
      "ID": "Feature-39",
      "name": "Zoom",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Canvas",
        "Shortcut": "mouse wheel",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 2.7449,
        "y": -29.372,
        "z": 0.01
      },
      "description": "When a reader wants the overview or a closer look, they turn the mouse wheel or pinch, and the canvas zooms towards the pointer. Zooming out shows the shape of the whole graph and its colour regions; zooming in makes labels readable.\n\nThe furthest view is marked by a message, and Fill small nodes keeps a large graph readable from far away. The zoom level travels with a Share link to my view."
    },
    {
      "ID": "Feature-40",
      "name": "Pan",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Canvas",
        "Shortcut": "right mouse button drag",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 6.3025,
        "y": -31.883,
        "z": 0
      },
      "description": "When the part of the graph a reader wants is off screen, they hold the right mouse button and drag to move the canvas, or drag with two fingers on a touch screen. A right-click without dragging opens a context menu instead, so one button serves both. Panning never moves nodes, only the view, and the camera position travels with a Share link to my view."
    },
    {
      "ID": "Feature-camera",
      "name": "Camera",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 6.63,
        "y": -21.501,
        "z": 0.01
      },
      "description": "The camera is the reader's viewpoint on the canvas. A graph opens with a default view unless the address carries a saved view, and the reader moves it by zooming, panning, double-clicking a node or clicking a connection in the Detail panel.\n\nA graph may spread as far as it needs and people zoom out to see it, up to a furthest view that a message marks. Resizing the browser window keeps the same point in the centre at the same zoom. A Share link to my view stores the camera position so another person opens the same view."
    },
    {
      "ID": "Feature-41",
      "name": "Hover on node",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Canvas",
        "Shortcut": "point",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 2.9646,
        "y": -36.3794,
        "z": 0.01
      },
      "description": "When a reader points at a node, the node and the nodes linked to it light up and its links are drawn stronger, while nothing else changes, so a person can look around without the graph flickering.\n\nThis answers the question what is this connected to without a click, and it follows hidden links too, so even undrawn relationships light up. Moving the graph with the right button or two fingers does not light the nodes passing under the pointer."
    },
    {
      "ID": "Feature-43",
      "name": "Double click on node",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Canvas",
        "Shortcut": "double-click",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 11.0624,
        "y": -31.6208,
        "z": 0.01
      },
      "description": "When a reader wants to go to a node, they double-click it: the camera glides until the node is centred and rings pulse out from it. This keeps the reader oriented in a large graph, because the movement shows where the node sits relative to where they were."
    },
    {
      "ID": "Feature-44",
      "name": "Click on detail link",
      "type": "Feature",
      "properties": {
        "Area": "Detail panel",
        "Where": "Detail panel",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 23.6995,
        "y": -3.7861,
        "z": 0.01
      },
      "description": "When a reader clicks a connection in the Detail panel, the canvas brings that node to the centre of the visible area, not under the panel, and opens its Detail panel. A reader can therefore walk a whole subject from panel to panel, like following links in a document, while the canvas shows where each step leads."
    },
    {
      "ID": "Feature-42",
      "name": "Click on node",
      "type": "Feature",
      "properties": {
        "Area": "Selection",
        "Where": "Canvas",
        "Shortcut": "click",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -1.1934,
        "y": -32.2279,
        "z": 0.01
      },
      "description": "When a reader clicks a node, it becomes selected, its Detail panel opens on the right and the rest of the graph steps back as Node Opacity sets, so its connections stand out. The state stays after the pointer leaves, so the reader can study one neighbourhood while reading about it. Clicking another node moves the focus and scrolls the panel back to the top."
    },
    {
      "ID": "Feature-shift-click",
      "name": "Shift-click",
      "type": "Feature",
      "properties": {
        "Area": "Selection",
        "Where": "Canvas",
        "Shortcut": "Shift-click",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -1.808,
        "y": -34.4526,
        "z": 0.01
      },
      "description": "When a person wants to work on several nodes at once, Shift-click adds a node to the selection or takes it out again while the others stay selected. The selection then moves, aligns, distributes, arranges or deletes as one group, which replaces repeating the same step node by node."
    },
    {
      "ID": "Feature-area-selection",
      "name": "Area selection",
      "type": "Feature",
      "properties": {
        "Area": "Selection",
        "Where": "Canvas",
        "Shortcut": "Shift-drag",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -0.4989,
        "y": -41.997,
        "z": 0.01
      },
      "description": "When a whole region needs to move or be arranged, the person holds Shift and drags across empty canvas; a dashed rectangle appears and every visible node it touches joins the selection. Nodes faded out by a filter are never picked up, so filtering first and then dragging selects exactly the matching nodes. No Detail panel opens, so the canvas stays clear for the next step."
    },
    {
      "ID": "Feature-clear-selection",
      "name": "Clear selection",
      "type": "Feature",
      "properties": {
        "Area": "Selection",
        "Where": "Canvas",
        "Shortcut": "click empty canvas",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -0.0623,
        "y": -44.5,
        "z": 0.01
      },
      "description": "When a person is done with a selection, they click empty canvas: every node is deselected and the Detail panel closes. The graph returns to its resting state, ready for the next question."
    },
    {
      "ID": "Feature-45",
      "name": "Select a link",
      "type": "Feature",
      "properties": {
        "Area": "Selection",
        "Where": "Canvas",
        "Shortcut": "hold L + click",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -0.2356,
        "y": -39.4993,
        "z": 0.01
      },
      "description": "Links are click-through by default, so a plain click reaches the node or empty space behind them and dense graphs stay easy to click. When a person needs the link itself, for example to delete it, they hold L: the link under the pointer previews, a hint reads Hold L and click a link to select it, and a click selects it."
    },
    {
      "ID": "Feature-drag-to-move",
      "name": "Drag to move",
      "type": "Feature",
      "properties": {
        "Area": "Selection",
        "Where": "Canvas",
        "Shortcut": "drag; Alt to place freely",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -2.7696,
        "y": -36.8962,
        "z": 0.01
      },
      "description": "When a node sits in the wrong place, the person drags it; if it belongs to a selection, the whole selection moves together. While dragging, the node snaps to the edges, centres and equal spacing of its neighbours so the result stays tidy, and holding Alt places it freely. The new positions are persisted with the graph and the move can be undone."
    },
    {
      "ID": "Feature-65",
      "name": "Node ID",
      "type": "Feature",
      "properties": {
        "Area": "Detail panel",
        "Where": "Detail panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [2.5, 1],
      "position": {
        "x": 24.9499,
        "y": -1.5815,
        "z": 0.01
      },
      "description": "Every node has an ID that identifies it in the data and that links point to. Hovering the node's name in the Detail panel shows Node ID followed by the value, so a person can find the same node in the raw JSON. The ID is fixed once the node exists and is read-only in Edit node; because the import does not check that IDs are unique, whoever writes the data keeps them unique."
    },
    {
      "ID": "Feature-clickable-web-addresses",
      "name": "Clickable web addresses",
      "type": "Feature",
      "properties": {
        "Area": "Detail panel",
        "Where": "Detail panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 38.3944,
        "y": -6.8462,
        "z": 0.01
      },
      "description": "When a description contains a web address, the Detail panel turns it into a link the reader can open. A node can therefore point to its source, a document or a demo without any extra field, and the address still counts as text for search."
    },
    {
      "ID": "Feature-widen-the-detail-panel",
      "name": "Widen the Detail panel",
      "type": "Feature",
      "properties": {
        "Area": "Detail panel",
        "Where": "Detail panel",
        "Shortcut": "",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 38.9497,
        "y": -1.981,
        "z": 0.01
      },
      "description": "When a node holds long text or a gallery, the reader drags the Detail panel's left edge to make it wider, anywhere from 450 to 900 pixels. Every Detail panel then opens at that width, which keeps reading many nodes in a row comfortable. The width is forgotten on reload."
    },
    {
      "ID": "Feature-76",
      "name": "Two details",
      "type": "Feature",
      "properties": {
        "Area": "Detail panel",
        "Where": "Detail settings",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.8, 1.5],
      "position": {
        "x": 34.456,
        "y": -1.7422,
        "z": 0.01
      },
      "description": "Each node type decides which of its properties appear in two places: in its own Detail panel, set under Own detail, and in the panels of other nodes where it is listed as a connection, set under As a connected node.\n\nThe person opens the gear Edit detail settings in a Detail panel, toggles All or moves properties between Available and Displayed, and presses Apply changes. The setting applies to every node of that type, so a panel shows what matters there and a long connection list stays short."
    },
    {
      "ID": "Feature-87",
      "name": "Connection order",
      "type": "Feature",
      "properties": {
        "Area": "Detail panel",
        "Where": "Detail settings",
        "Shortcut": "Alt+arrows",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [4, 1.5],
      "position": {
        "x": 34.7,
        "y": -4.5724,
        "z": 0.01
      },
      "description": "When a node of a type is open, its connections are listed grouped by type, and Connection order in Detail settings decides the order of those groups. The person drags the connected types into the order they should be read and chooses Apply changes, so the most important neighbours come first.\n\nThe panel's text says the order applies to the whole graph, but it is stored and applied per node type; in the data it is the order list of a Detail settings entry."
    },
    {
      "ID": "Message-unsaved-changes-dialog",
      "name": "Changes not applied",
      "type": "Message",
      "properties": {
        "Area": "Editing",
        "Where": "Right dock",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": -13.4624,
        "z": 0.01
      },
      "description": "When a person closes Edit node, Edit link, Detail settings or Node Types with changes that were not applied, a question titled Changes not applied offers Keep editing and Discard changes. This prevents losing a long edit through a stray click or Escape."
    },
    {
      "ID": "Feature-47",
      "name": "Add node",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Canvas",
        "Shortcut": "Cmd/Ctrl-click empty canvas",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 11.5832,
        "y": -22.7174,
        "z": 0.01
      },
      "description": "When a new idea needs a place, the person Cmd/Ctrl-clicks empty canvas or right-clicks and chooses Create node here. The Add new node panel docks on the right and asks for a unique ID, a name, a description, a type, whose properties then appear, and a size if wanted.\n\nOn confirm the node bursts in where the person clicked; a stray click on the canvas does not cancel it, Close or Escape does. The new node can be undone like any other change."
    },
    {
      "ID": "Feature-48",
      "name": "Edit node",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Edit node",
        "Shortcut": "Alt-click",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 18.9496,
        "y": -26.4038,
        "z": 0.01
      },
      "description": "When a node needs changing, the person Alt-clicks it, presses the pencil in its Detail panel or right-clicks and chooses Edit node. The Edit node panel has four sections: Identity and Content with the read-only ID, the name, description and type; Appearance with the size and Resize label text to fit; Properties with inputs that match each data type; and Gallery.\n\nChanging the type keeps properties with the same name and clears the others, with a warning. Apply changes or Enter updates the node with a ripple, and the edit can be undone. The change stays in the tab until Persist on server."
    },
    {
      "ID": "Feature-46",
      "name": "Add link",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Canvas",
        "Shortcut": "Cmd/Ctrl-click two nodes",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 16.3061,
        "y": -30.9695,
        "z": 0.01
      },
      "description": "When two ideas are related, the person Cmd/Ctrl-clicks the first node and then the second, with a line following the pointer, or right-clicks the first node, chooses Add link and clicks the second. Escape cancels. The Add New Link card asks for Name A to B, required, and Name B to A, optional, and offers four Direction tiles: None, A to B, B to A and Both.\n\nWith the second name empty, one name reads both ways. The card suggests the names of the last link, and its help lines show how each node's Detail panel will read the link. Add Link draws it from the first node to the second, and Edit link can change it later."
    },
    {
      "ID": "Feature-delete-nodes-and-links",
      "name": "Delete nodes and links",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Canvas",
        "Shortcut": "Delete / Backspace",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 11.4669,
        "y": -20.5125,
        "z": 0.01
      },
      "description": "When a node or link is no longer needed, the person selects it and presses Delete or Backspace, or chooses Delete node from the right-click menu. Mindshare asks first, Delete followed by the name or the number of nodes; deleting a node also removes its links, while deleting a link keeps both nodes. Every delete can be undone, and the keys never act while the person is typing in a field."
    },
    {
      "ID": "Feature-duplicate-node",
      "name": "Duplicate node",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Right-click menu",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 15.7844,
        "y": -33.4642,
        "z": 0.01
      },
      "description": "When a new node should look like an existing one, the person right-clicks it and picks Duplicate node. The copy appears slightly offset and selected, with the same content but without links, ready to be renamed and connected. This saves filling in type, size and properties again."
    },
    {
      "ID": "Feature-resize",
      "name": "Resize",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Canvas",
        "Shortcut": "R",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 13.4114,
        "y": -27.3931,
        "z": 0.01
      },
      "description": "When one node should stand out or fit its label, the person selects it and presses R, or picks Resize from the right-click menu, and drags a round knob on the blue frame; the node grows or shrinks around its centre while a label shows the size. Size is how a graph shows importance, so a hub can be made larger than its details.\n\nEscape during a drag puts the size back, and Escape or a click elsewhere leaves resizing. One node is resized at a time, and the change is one step in History. A node shown filled by Fill small nodes cannot be resized until the person zooms in."
    },
    {
      "ID": "Feature-resize-label-text-to-fit",
      "name": "Resize label text to fit",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 20.9975,
        "y": -33.4568,
        "z": 0.01
      },
      "description": "When a name is longer than its node, the label would spill out; switching on Resize label text to fit in Edit node, under Appearance, shrinks the text until it fits inside the shape. The node keeps its size, so the layout does not change, and the setting is stored per node with the graph."
    },
    {
      "ID": "Feature-82",
      "name": "Name",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [4, 1.5],
      "position": {
        "x": 21.2065,
        "y": -35.6726,
        "z": 0.01
      },
      "description": "A node's name states its main idea and is drawn inside the node's shape and titles the Detail panel. A short, plain name keeps the canvas readable, while longer explanation belongs in the description. Search and the name filter look at it, so a clear name also makes a node easy to find."
    },
    {
      "ID": "Feature-83",
      "name": "Description",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Detail panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [4, 1.5],
      "position": {
        "x": 20.8997,
        "y": -31.136,
        "z": 0.01
      },
      "description": "Every node can carry a description, free text that may run to several paragraphs. A reader sees it in the Detail panel after clicking the node, which is where the real explanation lives while the canvas shows only names. Web addresses in it become links, and search and the description filter read it, so a good description makes a node both understandable and findable."
    },
    {
      "ID": "Feature-86",
      "name": "Type",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [4, 1.5],
      "position": {
        "x": -9.2827,
        "y": -21.0435,
        "z": 0.01
      },
      "description": "A node's type says what kind of thing it is, and Mindshare uses it for three things: the shape and colour on the canvas, the properties the node must carry, and the Detail settings that decide what its panel shows.\n\nA person picks the type when adding or editing a node and defines new types in the Node Types manager. Because readers learn a graph by its kinds of nodes, a small, clear set of types makes everything else easier."
    },
    {
      "ID": "Feature-node-types-manager",
      "name": "Node Types manager",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -4.6708,
        "y": -25.0686,
        "z": 0.01
      },
      "description": "When a graph needs a new kind of node, the person opens Manage node types from the Legend and adds a type: a unique name, a shape, Circle, Rectangle, Hexagon or Star, and a colour with a live preview, and its properties, either reused from another type, which copies only the name and data type, or created new with one of the eight data types.\n\nApply changes makes the type available in the Legend, in Add node and Edit node and in filters, and the change can be undone. A type that no node uses yet is not kept when the graph is persisted."
    },
    {
      "ID": "Feature-52",
      "name": "Legend",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Legend",
        "Shortcut": "Option/Alt+Shift+K",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -4.6971,
        "y": -22.5153,
        "z": 0.01
      },
      "description": "The Legend explains the colours and shapes. A reader opens it at the bottom of the left toolbar and sees every node type with its shape, colour and a count of the nodes currently visible.\n\nFrom here a type can be used as a filter or edited in the Node Types manager. It is closed by default and its open or closed state is forgotten on reload."
    },
    {
      "ID": "Feature-legend-filter",
      "name": "Legend filter",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -6.5326,
        "y": 21.5308,
        "z": 0.01
      },
      "description": "When a reader wants to see only one kind of node, they open the Legend and click its row; every other node fades. Clicking more rows adds those types, and clicking a row again removes it. The choice also appears among the Active filters as the type name followed by legend, so it can be switched off there like any other filter."
    },
    {
      "ID": "UI-24",
      "name": "Legend button",
      "type": "UI",
      "properties": {
        "Area": "Node types and look",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+K",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -49.4061,
        "y": -22.5153,
        "z": 0.01
      },
      "description": "The Legend button at the bottom of the left toolbar switches the Legend on and off. Unlike the other side panels it stays open while other tools are used, so a reader can keep the key to the colours in view."
    },
    {
      "ID": "Visuals-71",
      "name": "Circle",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -14.3562,
        "y": -29.1573,
        "z": 0.01
      },
      "description": "A node type can be drawn as a circle, the most common shape for hubs and main concepts. Its size is one number, the radius, so making a circle larger shows importance at a glance. It can show a cover image in place of its name."
    },
    {
      "ID": "Visuals-70",
      "name": "Rectangle",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -20.8558,
        "y": -24.2701,
        "z": 0
      },
      "description": "A node type can be drawn as a rectangle with rounded corners, which fits long labels such as feature names. Its size is a width and a height instead of one number, so Edit node shows Width and Height for it. It can show a cover image in place of its name."
    },
    {
      "ID": "Visuals-hexagon",
      "name": "Hexagon",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -20.7716,
        "y": -30.0132,
        "z": 0.01
      },
      "description": "A node type can be drawn as a six-sided shape, chosen in the Node Types manager. Giving one kind of node its own shape lets readers recognise it at a glance, even in a large graph or when colours are hard to tell apart. Its size is one number, the radius, and it can show a cover image."
    },
    {
      "ID": "Visuals-star",
      "name": "Star",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -26.0538,
        "y": -26.9713,
        "z": 0.01
      },
      "description": "A node type can be drawn as a five-pointed star, which draws the eye and suits a few special nodes such as showcases. A star takes no cover image, so its name always shows. Its size is one number, the radius."
    },
    {
      "ID": "Visuals-polygons",
      "name": "Polygons",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": false
      },
      "size": 2.5,
      "position": {
        "x": -5.2215,
        "y": -29.0342,
        "z": 0.01
      },
      "description": "When four shapes are not enough, a node type can be drawn as a regular polygon with 5 to 20 sides. Polygons cannot be chosen in the Node Types manager; they come only from the graph data, where the shape is written as hex with the number of sides. Large graphs get more distinct node kinds without relying on colour alone; in this graph the pentagons, octagons and twelve-sided nodes are polygons."
    },
    {
      "ID": "Visuals-type-colour",
      "name": "Type colour",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -9.9425,
        "y": -25.1027,
        "z": 0.01
      },
      "description": "Every node type has one colour. Nodes are white inside, and the colour draws the border, the hover and selection rings, the glow and the legend icon. Choosing clearly different colours per type lets a reader tell kinds of nodes apart before reading a single label, and Glow turns the colours into regions when zoomed out."
    },
    {
      "ID": "Visuals-default-look",
      "name": "Default look",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": false
      },
      "size": 2.5,
      "position": {
        "x": -25.2199,
        "y": -20.4989,
        "z": 0.01
      },
      "description": "When a node's type has no look defined in the data, Mindshare still draws it: as a purple circle, or as a rectangle if the type is literally named Segment. The graph opens, but the legend and colours are wrong, so whoever writes the data gives every type its own visual entry."
    },
    {
      "ID": "Visuals-node-size",
      "name": "Node size",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Edit node",
        "Shortcut": "R",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -9.9403,
        "y": -33.037,
        "z": 0.01
      },
      "description": "Each node has its own size: one number, the radius, for circles, hexagons, stars and polygons, and a width and height for rectangles and canvas pictures. Size carries meaning, such as making hubs larger than the details around them.\n\nIt is set when the node is created, changed with Resize or in Edit node, copied with Copy properties and persisted with the graph. A size written in the wrong form for the shape is silently replaced by the default, and the smallest radius is 0.5."
    },
    {
      "ID": "Visuals-72",
      "name": "Position",
      "type": "Visuals",
      "properties": {
        "Area": "Layout",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -22.5806,
        "y": -4.3725,
        "z": 0
      },
      "description": "Every node has a position on the canvas, the point at its centre, measured in canvas units with Y growing upwards. Positions decide how a graph reads, and they change whenever a person drags, aligns, arranges or moves nodes through zones.\n\nAll positions are persisted with the graph. In the data a graph gives positions to all nodes or to none: without them Mindshare arranges the graph itself on opening."
    },
    {
      "ID": "Visuals-73",
      "name": "3D Engine",
      "type": "Visuals",
      "properties": {
        "Area": "Node types and look",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -23.978,
        "y": -14.4587,
        "z": 0
      },
      "description": "Mindshare is implemented as a 2D application in a 3D environment, with future compatibility in mind. The canvas is drawn by a 3D engine, with the graph laid flat at depth zero and the camera looking down on it, which is why positions carry a third value that stays at about zero. Readers see a flat graph today, while the engine leaves room for richer views later."
    },
    {
      "ID": "Feature-58",
      "name": "Animations",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -14.7434,
        "y": -16.9965,
        "z": 0.01
      },
      "description": "Mindshare answers every action with a small movement so people see what changed: a new node bursts in, an edited node ripples, a deleted node collapses with a fading ring, a new link draws itself in, flying to a node pulses rings, and arranged or undone nodes glide to their places, while one calm loading animation shows that a page or graph is on its way.\n\nThe motion helps the eye follow changes in a large graph."
    },
    {
      "ID": "Feature-61",
      "name": "Pulsing node",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -17.1986,
        "y": -14.5071,
        "z": 0.01
      },
      "description": "When the canvas flies to a node, after a double-click or a click on a connection, rings pulse out from that node. The pulse marks the node that has the focus and sets it apart from the other highlighted nodes, so the reader's eye lands in the right place."
    },
    {
      "ID": "Feature-62",
      "name": "Highlighted node",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -18.8663,
        "y": -12.2602,
        "z": 0.01
      },
      "description": "A highlighted node stands out in its type colour. Pointing at a node lights it and its neighbours for as long as the pointer stays, and a click selects the node while the rest of the graph steps back as Node Opacity sets. This is how Mindshare answers what belongs together without changing the graph."
    },
    {
      "ID": "Feature-glow",
      "name": "Glow",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+W",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -15.3335,
        "y": -25.2018,
        "z": 0.01
      },
      "description": "When a reader zooms out and wants to see where each kind of node lives, they open Glow on the left toolbar and raise Glow spread from 0 to 100. Every node gets a soft halo in its type colour, and nodes of the same colour that sit together merge into colour regions; Lock glow to zoom keeps the halo the same size on screen. Glow changes nothing in the data and is forgotten on reload."
    },
    {
      "ID": "Feature-reduce-motion",
      "name": "Reduce motion",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Everywhere",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -19.5007,
        "y": -17.1965,
        "z": 0.01
      },
      "description": "When the computer's reduce-motion setting is on, Mindshare replaces its big movements, such as nodes gliding into place or the camera flying, with instant changes. The loading animation becomes a calm still version. The result on the canvas is the same, so people who are sensitive to motion lose nothing."
    },
    {
      "ID": "Feature-screen-reader-announcements",
      "name": "Screen-reader announcements",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Everywhere",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -19.9211,
        "y": -19.6761,
        "z": 0.01
      },
      "description": "When a person aligns, arranges, uses a zone, plays a Movement or uses Copy properties, Mindshare announces the result to screen readers, for example Arranged N nodes. People who cannot see the animation can follow what happened."
    },
    {
      "ID": "Feature-keyboard-operation",
      "name": "Keyboard operation",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Everywhere",
        "Shortcut": "arrows, Enter, Space, Alt+arrows",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 7.8409,
        "y": -36.6711,
        "z": 0.01
      },
      "description": "Several panels work without a mouse. In Detail settings the arrow keys move the focus, Enter moves a property across and Alt with the arrows reorders; in the Active filters panel filters can be picked up, moved into or out of a set and dropped from the keyboard; in Copy properties Enter or Space paints the focused node; and Enter submits any open form.\n\nThis keeps the authoring tools usable for keyboard users."
    },
    {
      "ID": "Data model-65",
      "name": "String",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -1.1483,
        "y": 34.4809,
        "z": 0.01
      },
      "description": "A string property holds any text, such as an owner, a source or a list of synonyms. It is the safest type for a value that may be unknown, because it can be left empty. The Filter panel searches it with text contains, ignoring case and accents."
    },
    {
      "ID": "Data model-67",
      "name": "Typelist",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -2.7442,
        "y": 29.3721,
        "z": 0.01
      },
      "description": "A typelist property holds one value from a set, such as a status, a category or a chapter; the set is whatever values occur in the graph. Filtering offers the values present as a pick list, which makes typelists the natural choice for grouping nodes. A typelist may be left empty."
    },
    {
      "ID": "Data model-66",
      "name": "Boolean",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -3.8418,
        "y": 36.8,
        "z": 0.01
      },
      "description": "A bool property is either true or false, such as reviewed or optional. The Filter panel offers Yes or No for it. It has no empty value, so every node of the type carries true or false."
    },
    {
      "ID": "Data model-whole-number",
      "name": "Whole number",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -6.0176,
        "y": 33.9711,
        "z": 0.01
      },
      "description": "When a property counts something, such as pages or attendees, it is declared as int, a whole number. The value is written as a plain number, not as text, and the Filter panel offers a range slider for it instead of a text search. Every node of the type needs a value, because a whole number has no empty value."
    },
    {
      "ID": "Data model-decimal-number",
      "name": "Decimal number",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 0.431,
        "y": 38.9976,
        "z": 0.01
      },
      "description": "When a property measures something with fractions, such as a score or a price, it is declared as dec. The Filter panel then offers a number range for it. Like whole numbers it has no empty value, so a value that may be unknown is better kept as text."
    },
    {
      "ID": "Data model-percentage",
      "name": "Percentage",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -4.4396,
        "y": 39.2497,
        "z": 0.01
      },
      "description": "When a property is a share from 0 to 100, such as progress or coverage, it is declared as perc and written like 40%. The Filter panel offers a range for it. Only whole percentages without a leading zero are accepted, and every node of the type needs one."
    },
    {
      "ID": "Data model-69",
      "name": "Datetime",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -4.7309,
        "y": 31.6484,
        "z": 0.01
      },
      "description": "A datetime property holds a date, written as year-month-day, or a date with a time of day, written as year-month-day, T, then hours:minutes:seconds. One type covers both forms.\n\nThe Filter panel offers From and To dates with optional times, so readers can narrow a graph to a period. It has no empty value, so a date that may be unknown is kept as text instead."
    },
    {
      "ID": "Data model-duration",
      "name": "Duration",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Legend",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 0.1517,
        "y": 31.9996,
        "z": 0.01
      },
      "description": "When a property is a length of time, such as a meeting or a break, it is declared as time in the pattern the graph needs: hours, minutes and seconds, or only some of them, for example hours and minutes. The Filter panel then offers a duration range. Every node of the type needs a value in the declared pattern."
    },
    {
      "ID": "Data model-data-types-dictionary",
      "name": "Data types dictionary",
      "type": "Data model",
      "properties": {
        "Area": "Data and integration",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 18.3829,
        "y": 19.0871,
        "z": 0.01
      },
      "description": "Every property used on any node or link is declared once, with its data type, in the graph's data types dictionary. Because it is one dictionary for the whole graph, a property name has one type everywhere: a Score that is a whole number on one type is a whole number on every type and on links. An undeclared property or a value in the wrong form stops the import with a message that names it."
    },
    {
      "ID": "Data model-property-rules",
      "name": "Property rules",
      "type": "Data model",
      "properties": {
        "Area": "Properties",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -1.5688,
        "y": 41.4703,
        "z": 0.01
      },
      "description": "The import checks three rules for properties. All nodes of one type carry the same property names in the same order, and all links share one list; either every node of a type has a properties object or none does; and numbers, percentages, dates and durations always carry a valid value, because only text, lists and yes/no have an empty value.\n\nBreaking a rule stops the import with a message naming the node, so data written by hand or by a program is checked before it goes in."
    },
    {
      "ID": "Data model-link-properties",
      "name": "Link properties",
      "type": "Data model",
      "properties": {
        "Area": "Links",
        "Where": "Edit link",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 31.9889,
        "y": -8.106,
        "z": 0.01
      },
      "description": "Links can carry their own properties, just like nodes, for example a weight or the kind of relationship. A person changes them in Edit link.\n\nAll links in a graph share one list of property names in one order, declared in the same data types dictionary as node properties. The Filter panel can filter links by them through Connections, and the Detail panel can show them per view."
    },
    {
      "ID": "Feature-70",
      "name": "Link names",
      "type": "Feature",
      "properties": {
        "Area": "Links",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.5959937372578317, 1.1852734785158674],
      "position": {
        "x": 33.5141,
        "y": -14.4588,
        "z": 0.01
      },
      "description": "A relationship can have one name that applies both ways, or two names, one from the point of view of each node. In the Detail panel each connected node is introduced by the name that fits the open node, so the same link reads Canvas displays Node from one side and Node lives on Canvas from the other. Short verb phrases make a graph read like sentences."
    },
    {
      "ID": "Feature-59",
      "name": "Directions",
      "type": "Feature",
      "properties": {
        "Area": "Links",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 31.8401,
        "y": -11.9251,
        "z": 0.01
      },
      "description": "A link can show an arrow at one end, at the other, at both or at neither. The person picks one of four tiles, None, A to B, B to A or Both, when adding the link or later in Edit link and the link menu. Arrows suit sequences and flows, such as the import, persist and share steps in this graph, while most relationships read well without them."
    },
    {
      "ID": "Feature-60",
      "name": "Hidden links",
      "type": "Feature",
      "properties": {
        "Area": "Links",
        "Where": "Right-click menu",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 29.125,
        "y": -14.4217,
        "z": 0.01
      },
      "description": "When a graph has so many links that they clutter the canvas, some can be hidden: the person chooses Hide link in the link menu or switches it in Edit link.\n\nA hidden link is not drawn, but it still counts as a connection: it stays in both nodes' Detail panels with its name underlined, and pointing and Show connected nodes still follow it. It can be shown again from its row's menu. The Keyboard shortcuts node in this graph uses them."
    },
    {
      "ID": "Actions-78",
      "name": "Search",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Top toolbar",
        "Shortcut": "Option/Alt+Shift+F",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -15.9335,
        "y": 30.6002,
        "z": 0.009999999999971578
      },
      "description": "When a reader looks for a word, they open Search, the magnifier in the top toolbar, type the text and press Enter. Mindshare adds a filter that keeps every node whose name or description contains the text, ignoring case and accents but without fuzzy matching, and the other nodes fade.\n\nThe search box clears while the filter stays in Active filters, where it can be switched off or removed. The same key closes Search again."
    },
    {
      "ID": "UI-26",
      "name": "Filters button",
      "type": "UI",
      "properties": {
        "Area": "Filtering",
        "Where": "Top toolbar",
        "Shortcut": "Option/Alt+Shift+L",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 5.2983,
        "y": 51.3003,
        "z": 0.01
      },
      "description": "The Filters button, a funnel in the top toolbar, opens the Add filter card. It is the starting point for every filter except search and legend filters."
    },
    {
      "ID": "UI-32",
      "name": "Add filter card",
      "type": "UI",
      "properties": {
        "Area": "Filtering",
        "Where": "Filter panel",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -14.6283,
        "y": 36.6915,
        "z": 0.01
      },
      "description": "The Add filter card asks in order for the condition, AND or OR, an optional name for a new filter set, the node type, all nodes or Connections, the property, such as name plus description, name, description or one of the type's properties, and a value input that fits the property's data type. Add filter puts the filter into the Active filters panel, so a precise question is built in a few steps."
    },
    {
      "ID": "UI-33",
      "name": "New filter set name",
      "type": "UI",
      "properties": {
        "Area": "Filtering",
        "Where": "Filter panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -20.9225,
        "y": 31.1207,
        "z": 0.01
      },
      "description": "When a person wants several filters to work as one condition, they type a name into New filter set in the filter card, or later name a set made by dragging filters together. The named set appears in the Active filters panel and can be switched off as a whole."
    },
    {
      "ID": "Feature-66",
      "name": "Type filter",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Filter panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.757071151784018, 1.3612604505139814],
      "position": {
        "x": -11.0783,
        "y": 31.0849,
        "z": 0.01
      },
      "description": "The simplest filter keeps the nodes of one node type and fades all others. A reader picks the type in the filter card without choosing a property, which shows one kind of node across the whole graph."
    },
    {
      "ID": "Feature-67",
      "name": "Property filter",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Filter panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.883991299912415, 1.4279602031101177],
      "position": {
        "x": -11.2816,
        "y": 28.8743,
        "z": 0.01
      },
      "description": "A property filter keeps the nodes whose property meets a condition. The reader picks a node type or all nodes, then the name, the description, both together or one of the type's properties, and then a value. It answers precise questions such as which items are reviewed or which dates fall in a quarter."
    },
    {
      "ID": "Feature-value-inputs-per-data-type",
      "name": "Value inputs per data type",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Filter panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -10.1672,
        "y": 36.0954,
        "z": 0.01
      },
      "description": "When a filter is built on a property, the card offers an input that fits its data type: text contains for text, pick values for a typelist, Yes or No for a true-false property, a range slider for whole numbers, decimals and percentages, From and To dates with optional times for dates, and a duration range for times. Each property is filtered in its natural way instead of as plain text."
    },
    {
      "ID": "Feature-connections-filter",
      "name": "Connections filter",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Filter panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -16.5637,
        "y": 33.0854,
        "z": 0.01
      },
      "description": "When the question is about relationships rather than nodes, the person picks Connections in the filter card and filters links by one of their properties. This lets a reader focus on one kind of relationship across the whole graph, and it combines with node filters by the usual AND and OR rules."
    },
    {
      "ID": "Feature-69",
      "name": "Logical operators",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Filter panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [4, 2],
      "position": {
        "x": -11.7558,
        "y": 33.497,
        "z": 0.01
      },
      "description": "Each filter is added with one of two operators. Every AND filter and every filter set must be satisfied for a node to stay visible, while any single OR filter is enough on its own; inside a set the same rule applies. Mixing them lets a reader say exactly what they want to see."
    },
    {
      "ID": "UI-34",
      "name": "Active filters panel",
      "type": "UI",
      "properties": {
        "Area": "Filtering",
        "Where": "Active filters panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -16.8805,
        "y": 23.5807,
        "z": 0.01
      },
      "description": "As soon as one filter exists, the Active filters panel appears and lists each filter as a chip naming its type, property and condition. Here a reader switches filters off and on, removes one with its cross, drags filters into sets, and turns on Show connected nodes and Apply filter to node detail.\n\nClose, the X at the far right, removes every filter at once with no question, no message and no Undo. A saved selection's filter shows here too as Selection followed by its node count. It is the control room for everything the reader currently sees."
    },
    {
      "ID": "Feature-19",
      "name": "Toggle",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Active filters panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -16.8748,
        "y": 21.077,
        "z": 0.01
      },
      "description": "When a reader wants to compare the graph with and without a filter, they click its chip in the Active filters panel: the filter switches off without being lost, and another click switches it back on. Trying alternatives therefore costs nothing."
    },
    {
      "ID": "Feature-68",
      "name": "Filter set",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Active filters panel",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.5, 1.5],
      "position": {
        "x": -15.9732,
        "y": 28.3038,
        "z": 0.01
      },
      "description": "When a condition needs several filters together, the person drags one filter onto another in the Active filters panel to make a filter set, and drags more filters onto it. A set can be named, switched off as a whole, expanded and collapsed, and counts as one AND condition, so elaborate questions stay readable."
    },
    {
      "ID": "Feature-20",
      "name": "Show connected nodes",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Active filters panel",
        "Shortcut": "",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -16.12,
        "y": 25.892,
        "z": 0.01
      },
      "description": "When filtered results lose their context, the reader turns on Show connected nodes: the neighbours of every matching node stay visible too, even if they do not meet the conditions, and hidden links are followed as well. The result shows not only what matches but what it touches. A share link to the view does not restore this switch, so a shared view that needs it asks the viewer to tick it."
    },
    {
      "ID": "Feature-21",
      "name": "Apply filter to node detail",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Active filters panel",
        "Shortcut": "",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -11.4012,
        "y": 26.6648,
        "z": 0.01
      },
      "description": "By default filters change only the canvas. When a reader also wants the Detail panel to show only the connections that pass the filters, they turn on Apply filter to node detail, and filtered-out connections disappear from the panel too. Long connection lists then match what the canvas shows."
    },
    {
      "ID": "Feature-37",
      "name": "Node Opacity",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+O",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -20.9485,
        "y": 28.6602,
        "z": 0.01
      },
      "description": "Filtered-out nodes are not removed, they fade, and Node Opacity on the left toolbar decides how much. The 10-step slider runs from fully hidden to lightly faded, so a reader can keep the context faintly visible or remove it completely.\n\nThe same setting decides how far the rest of the graph steps back when a node is clicked, and nodes with pictures fade the same way as plain nodes. It is forgotten on reload."
    },
    {
      "ID": "UI-23",
      "name": "Node Opacity button",
      "type": "UI",
      "properties": {
        "Area": "Filtering",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+O",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -49.4061,
        "y": 28.6602,
        "z": 0.01
      },
      "description": "The Node Opacity button on the left toolbar opens the 10-step slider that sets how filtered-out nodes look. Like the other side panels it closes when another one opens or on a click elsewhere."
    },
    {
      "ID": "Feature-snap-to-node-guides",
      "name": "Snap to node guides",
      "type": "Feature",
      "properties": {
        "Area": "Layout",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+D; Alt/Option while dragging",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -30.9646,
        "y": 1.481,
        "z": 0.01
      },
      "description": "While a person drags a node or a group, it snaps to the edges, centres and equal spacing of the nodes around it, and grey dashed lines show what it lines up with. Hand-placed graphs stay tidy without measuring. The magnet on the left toolbar is on by default, and holding Alt or Option while dragging places a node freely."
    },
    {
      "ID": "Feature-show-grid",
      "name": "Show grid",
      "type": "Feature",
      "properties": {
        "Area": "Layout",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+G",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -30.4874,
        "y": -0.8749,
        "z": 0.01
      },
      "description": "When nodes should line up on a regular pattern, the person switches on Show grid: major lines appear every tenth row of the background dots and dragged nodes snap their centre to the grid. It works alongside the magnet, and switching it off never moves a node."
    },
    {
      "ID": "Feature-align",
      "name": "Align",
      "type": "Feature",
      "properties": {
        "Area": "Layout",
        "Where": "Canvas",
        "Shortcut": "Alt+A/D/W/S/H/V",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -23.0448,
        "y": 4.603,
        "z": 0.01
      },
      "description": "When two or more selected nodes should line up, the Align toolbar above the selection offers six commands: left, horizontal centres, right, top, vertical centres and bottom. One node stays where it is and the others glide into line with it. The same commands are in the right-click menu and on the keyboard, Alt or Option with A, D, W, S, H and V, and each one is a single undo step."
    },
    {
      "ID": "Feature-distribute",
      "name": "Distribute",
      "type": "Feature",
      "properties": {
        "Area": "Layout",
        "Where": "Canvas",
        "Shortcut": "Alt+Cmd/Ctrl+H/V",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -22.9894,
        "y": 6.8911,
        "z": 0.01
      },
      "description": "When three or more selected nodes should be evenly spaced, Distribute horizontally or vertically makes the gaps between them equal while the two outermost nodes stay in place. Rows and columns get an even rhythm. It is on the selection toolbar, in the right-click menu and on Alt+Cmd+H and Alt+Cmd+V, and each use is one undo step."
    },
    {
      "ID": "Feature-arrange-nodes",
      "name": "Arrange nodes",
      "type": "Feature",
      "properties": {
        "Area": "Layout",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+R",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -27.5824,
        "y": 4.818,
        "z": 0.01
      },
      "description": "When many nodes need a new layout at once, the person opens Arrange nodes, picks the scope, Selection or Everything, and a strategy, adjusts the settings it shows such as Gap, and presses Apply. On a large graph a thin bar moves above the buttons while the layout is worked out; then the nodes glide into place and a line in the pop-up says how many were arranged. The pop-up stays open, so several arrangements can be tried, and one Undo takes back one Apply.\n\nThere is no preview. Every layout works out its own tightest size, so nodes do not overlap, and each strategy's last settings are remembered while the page is open. Closing the pop-up while a layout is being worked out cancels it and nothing moves."
    },
    {
      "ID": "Feature-movements",
      "name": "Movements",
      "type": "Feature",
      "properties": {
        "Area": "Layout",
        "Where": "Bottom dock",
        "Shortcut": "Option/Alt+Shift+M",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -27.5957,
        "y": 7.1224,
        "z": 0.01
      },
      "description": "When a presenter wants to show nodes moving into a new arrangement and back, they click Movements on the left toolbar, which adds an empty bar to the bottom dock, drag nodes or a selection onto it, click Strategy and press Apply in the Arrange pop-up. The Movement is kept as a replayable step: Play forward glides the nodes to their end places and Play backward returns them, and the pressed button becomes Stop while they move.\n\nApplying again replaces the end positions. Several Movements can sit side by side; the Custom option does nothing at this release, and dismissing a bar leaves the nodes where they are. Movements are forgotten on reload, while the positions they leave behind are kept by the next persist."
    },
    {
      "ID": "Feature-planned-layouts",
      "name": "Planned layouts (not yet available)",
      "type": "Feature",
      "properties": {
        "Area": "Layout",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -27.7743,
        "y": -3.5483,
        "z": 0.01
      },
      "description": "These layouts are planned and not available in the app yet. More automatic layouts are planned for Mindshare: force-directed, tree, radial by distance, circular, grid by type, timeline, scatter and community layouts, together with pinning nodes so a layout leaves them in place. Until then, a graph written outside the app can carry any layout as positions in its data."
    },
    {
      "ID": "Strategy-row",
      "name": "Row",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -33.0799,
        "y": -5.2887,
        "z": 0.01
      },
      "description": "Row places the chosen nodes side by side in one line, each step as wide as the widest node plus the gap. It suits a short sequence, such as the steps of a process."
    },
    {
      "ID": "Strategy-grid",
      "name": "Grid",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -31.9913,
        "y": 11.5134,
        "z": 0.01
      },
      "description": "Grid places nodes in rows and columns, by default about as many columns as the square root of the count, each cell as large as the largest node plus the gap. It turns a loose pile into a neat block."
    },
    {
      "ID": "Strategy-concentric",
      "name": "Concentric",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -32.9837,
        "y": 5.8588,
        "z": 0.01
      },
      "description": "Concentric places nodes on rings around a centre, filling each ring before the next so neighbours never overlap. A related ring layout is what Mindshare uses when a graph arrives without positions."
    },
    {
      "ID": "Strategy-line",
      "name": "Line",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -35.9996,
        "y": 0.172,
        "z": 0.01
      },
      "description": "Line places nodes along a straight line at a chosen angle, snapping to 45 degrees when close. It suits timelines and chains, and it starts from the middle of the canvas rather than from where the nodes were."
    },
    {
      "ID": "Strategy-sunflower",
      "name": "Sunflower",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -38.0311,
        "y": 8.6392,
        "z": 0.01
      },
      "description": "Sunflower spirals nodes outward from a centre at the golden angle, the pattern of seeds in a sunflower head. It packs many nodes into a round, even cloud without rings."
    },
    {
      "ID": "Strategy-bin-pack",
      "name": "Bin-pack",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -25.6847,
        "y": 11.1489,
        "z": 0.01
      },
      "description": "Bin-pack fits nodes of different sizes tightly into a block, largest first, like packing boxes. It saves space when sizes vary a lot."
    },
    {
      "ID": "Strategy-grouped",
      "name": "Grouped",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -27.4184,
        "y": -7.7768,
        "z": 0.01
      },
      "description": "Grouped has settings for groups, but today it groups by nothing, so all nodes form one group and it works like its inner strategy."
    },
    {
      "ID": "Strategy-throw-spread",
      "name": "Throw & Spread",
      "type": "Strategy",
      "properties": {
        "Area": "Layout",
        "Where": "Arrange pop-up",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -33.3808,
        "y": 17.0872,
        "z": 0.01
      },
      "description": "Throw & Spread spreads out overlapping nodes until each has room, and it offers two choices. Keep shape moves nodes only as far as needed to stop them overlapping, which tidies a crowded area while keeping nodes roughly where they were; Pull together gathers them into one compact spiral."
    },
    {
      "ID": "Zone-transform-zone",
      "name": "Transform zone",
      "type": "Zone",
      "properties": {
        "Area": "Zones",
        "Where": "Canvas",
        "Shortcut": "Shift+Z",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -26.2553,
        "y": 26.7752,
        "z": 0.01
      },
      "description": "When many nodes need the same property change, such as setting a status or adding points to a score, the person gives a Transform zone its operations, a property, an operator and a value, and drops nodes into it. Only the operators that fit the property are offered: text, list, yes or no and date properties offer set and clear, number properties also add, subtract, multiply and divide.\n\nThe value is checked as it is typed, Add stays off until it fits, and a list property suggests the values already used. The zone pulses and the changed values flash; dropping several asks Apply to N nodes first. A change that cannot apply leaves the node as it was and says why, and each drop is one undo step."
    },
    {
      "ID": "Zone-container-zone",
      "name": "Container zone",
      "type": "Zone",
      "properties": {
        "Area": "Zones",
        "Where": "Canvas",
        "Shortcut": "Shift+Z",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -22.9399,
        "y": 20.8509,
        "z": 0.01
      },
      "description": "When a group of nodes should stay together, the person drops them into a Container zone; they stay exactly where they were dropped and move with the zone. Settings let the zone fade its nodes from 100 to 10 percent, scale them when the zone is resized, and put them back where they came from, at their original size if wanted, when the zone is closed."
    },
    {
      "ID": "Zone-portal-zone",
      "name": "Portal zone",
      "type": "Zone",
      "properties": {
        "Area": "Zones",
        "Where": "Canvas",
        "Shortcut": "Shift+Z",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": 2.5,
      "position": {
        "x": -28.9355,
        "y": 21.4181,
        "z": 0.01
      },
      "description": "When nodes should be collected somewhere else, the person uses a Portal: a node dropped into the input reappears at a small round output elsewhere, grows to full size and takes the next free place in a neat grid.\n\nSettings choose the exit direction, rows or columns, how many per line and whether a line connects input and output. Closing either half removes the portal, while the nodes that came through stay."
    },
    {
      "ID": "Feature-send-to-zone",
      "name": "Send to zone",
      "type": "Feature",
      "properties": {
        "Area": "Zones",
        "Where": "Right-click menu",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -25.3864,
        "y": 16.905,
        "z": 0.01
      },
      "description": "When dragging a node across a large graph to a Transform zone is awkward, the person right-clicks the node, picks Send to zone and then the zone. The zone's operations apply exactly as if the node had been dropped in."
    },
    {
      "ID": "Feature-copy-properties",
      "name": "Copy properties",
      "type": "Feature",
      "properties": {
        "Area": "Editing",
        "Where": "Bottom dock",
        "Shortcut": "Option/Alt+Shift+C; Escape to leave",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 16.1456,
        "y": -38.2305,
        "z": 0.01
      },
      "description": "When several nodes should share a size or a property value, the person turns on Copy properties on the left toolbar and clicks the source node, which flies into the toolbox in the bottom dock. Node size is already chosen and the list of what can be copied is open, so a first click on a node of the same shape pastes the size at once, or the person picks one of the source's custom properties and the chip shows the choice.\n\nEach further target click copies the value and a message names the old and new value. Size goes only between nodes of the same shape and a property only onto nodes whose type has it; a refused paint says why, and a node that already has the value is left alone. Each change is one step in History, and Escape leaves the tool."
    },
    {
      "ID": "Feature-undo-and-redo",
      "name": "Undo and redo",
      "type": "Feature",
      "properties": {
        "Area": "History",
        "Where": "Top toolbar",
        "Shortcut": "Cmd/Ctrl+Z; Cmd/Ctrl+Shift+Z or Ctrl+Y",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 24.6033,
        "y": -15.3518,
        "z": 0.01
      },
      "description": "When a change goes wrong, Cmd/Ctrl+Z takes it back and Cmd/Ctrl+Shift+Z or Ctrl+Y brings it back; the toolbar arrows do the same and their tooltips name the step. A short message says Undone or Redone with a button to reverse it.\n\nUndo never acts while the person is typing in a field, where the field has its own undo. If every change is undone back to the last persisted state, the graph counts as unchanged again and leaving the page gives no warning. Adding a picture is not a step."
    },
    {
      "ID": "Message-undone-and-redone-notices",
      "name": "Undone and Redone notices",
      "type": "Message",
      "properties": {
        "Area": "History",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": -15.9624,
        "z": 0.01
      },
      "description": "After an undo or redo, a short notice at the bottom says Undone or Redone with the name of the step and offers an inline button to reverse it. A person who undid one step too many fixes it with one click."
    },
    {
      "ID": "Feature-save",
      "name": "Persist on server",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Top toolbar",
        "Shortcut": "Cmd/Ctrl+S",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 9.9778,
        "y": 23.9551,
        "z": 0.01
      },
      "description": "When a graph should last, the person presses Persist on server, the database icon in the top toolbar, or Cmd/Ctrl+S. The first time, a dialog offers to protect the graph with a password; the graph is then created on the server and the address changes to its own address. Later persists replace it, and if the graph has a password it is asked for each time.\n\nPersisting keeps the graph itself, nodes, links, properties, types, positions, sizes, Detail settings and source link, and records which pictures the graph uses. Until the first persist, an opened or edited graph lives only in the browser tab and is lost on reload, after a warning from the browser. A use case or template cannot be replaced this way: persisting changes to one makes a graph of the person's own."
    },
    {
      "ID": "UI-29",
      "name": "Persist on server button",
      "type": "UI",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Top toolbar",
        "Shortcut": "Cmd/Ctrl+S",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 17.1983,
        "y": 51.3003,
        "z": 0.01
      },
      "description": "The Persist on server button, a database icon in the top toolbar, sends the graph to the server. The first press gives the graph its own address with a unique ID, after which Share becomes available. Cmd/Ctrl+S does the same."
    },
    {
      "ID": "Message-2",
      "name": "Graph was persisted on the server",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.8, 1.5],
      "position": {
        "x": 50.4829,
        "y": 20.4573,
        "z": 0.01
      },
      "description": "After a successful persist the message Graph was persisted on the server confirms that the graph is stored there, or adds with a password when one was set. If it fails, a message says why and that the changes are still in the tab."
    },
    {
      "ID": "Message-could-not-reach-the-server",
      "name": "Could not reach the server",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 22.9573,
        "z": 0.01
      },
      "description": "When a persist cannot reach the server, a message says Could not reach the server, so the graph may not be persisted, and that the changes are still in the tab. The person checks the connection and tries again."
    },
    {
      "ID": "Feature-large-graphs",
      "name": "Large graphs",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 14.1575,
        "y": 28.6978,
        "z": 0.01
      },
      "description": "Mindshare is tested with real graphs of up to about 300 nodes and 2,100 links, and the server accepts graphs up to 32 MB. A graph that is too large to persist says so and keeps the changes in the tab, while the Your data box accepts a file of up to 3 MB."
    },
    {
      "ID": "Message-this-project-is-too-large-to-save",
      "name": "This graph is too large to persist",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 32.9573,
        "z": 0.01
      },
      "description": "When a graph is bigger than the server accepts, persisting stops with This graph is too large to persist on the server. The message says the changes are still in the tab and that Download keeps a copy as a file, so nothing is lost, and the person shortens descriptions or splits off parts before trying again."
    },
    {
      "ID": "UI-30",
      "name": "Share button",
      "type": "UI",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Top toolbar",
        "Shortcut": "Option/Alt+Shift+S",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 23.8747,
        "y": 51.3003,
        "z": 0.01
      },
      "description": "The Share button in the top toolbar becomes available after the first persist and offers two choices: Share link to my view and Share link to the graph. Either copies an address to the clipboard and confirms with Link was copied."
    },
    {
      "ID": "Feature-57",
      "name": "Share link to my view",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Top toolbar",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 16.2278,
        "y": 26.1551,
        "z": 0.01
      },
      "description": "When a person wants someone else to see exactly what they see, they choose Share link to my view. The copied address also carries the camera position, the open Detail panel and the active filters, so the recipient lands on the same spot with the same filters.\n\nIt does not carry Show connected nodes, so a view that needs it asks the viewer to tick it. It also leaves out a saved selection's filter and carries only what is persisted."
    },
    {
      "ID": "Feature-share-link-to-the-file",
      "name": "Share link to the graph",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Top toolbar",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 16.2278,
        "y": 23.9551,
        "z": 0.01
      },
      "description": "When a person wants to pass on the graph itself, they choose Share link to the graph and get the plain graph address. The recipient opens the graph as it was last persisted, without any camera position or filters, and changes that are only in the sender's tab are not in it."
    },
    {
      "ID": "Data model-share-link-parameters",
      "name": "Share link parameters",
      "type": "Data model",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Share link",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 4.9359,
        "y": 28.5769,
        "z": 0.01
      },
      "description": "A share link to a view is the graph address plus parameters: x, y and z for the camera, detail for the node whose panel is open, and filters for the active filters written as JSON. Because the view lives in the address, it can also be written by hand or by a program to send people straight to one part of a graph."
    },
    {
      "ID": "Message-link-was-copied",
      "name": "Link was copied",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": -0.5126,
        "z": 0.01
      },
      "description": "After either Share choice, the notice Link was copied confirms that the address is on the clipboard and ready to paste into a message or document."
    },
    {
      "ID": "Feature-open-access",
      "name": "Open access",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 8.2705,
        "y": 30.9128,
        "z": 0.01
      },
      "description": "Anyone who has a graph's address can open it, without an account: there are no owners or sign-in yet. Whether they can replace it depends on the password.\n\nWith one they need it; without one anyone with the link can replace the graph and only the Mindshare admin can delete it. Sharing is as simple as sending a link, which also means a link to an unprotected graph goes only to people who are trusted."
    },
    {
      "ID": "Feature-55",
      "name": "Download",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Top toolbar",
        "Shortcut": "Option/Alt+Shift+J",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 16.2278,
        "y": 21.7551,
        "z": 0.01
      },
      "description": "When a person wants the graph as a file, they press Download: the whole graph downloads at once as a JSON file named after the graph with the date and time, or JSON if it has no name, in exactly the format the import accepts.\n\nNothing else is asked. The file holds positions, node types and Detail settings but nothing that lasts only while the page is open. It can be kept as a backup, edited outside the app and imported again as a new graph."
    },
    {
      "ID": "UI-31",
      "name": "Download button",
      "type": "UI",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Top toolbar",
        "Shortcut": "Option/Alt+Shift+J",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 29.8247,
        "y": 51.3003,
        "z": 0.01
      },
      "description": "The Download button in the top toolbar downloads the full graph as JSON and confirms with Graph was downloaded as a JSON file."
    },
    {
      "ID": "Message-3",
      "name": "Graph was downloaded as a JSON file",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.8, 1.5],
      "position": {
        "x": 50.4829,
        "y": 17.9573,
        "z": 0.01
      },
      "description": "After Download the message Graph was downloaded as a JSON file confirms that the file is on the computer."
    },
    {
      "ID": "Feature-53",
      "name": "Source link",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Title panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 7.5392,
        "y": 33.1536,
        "z": 0.01
      },
      "description": "When a graph is produced from a document or a website, its data can carry one source link for the whole graph. It shows in the graph's info under Details, so readers can always go back to where the knowledge came from. The link is set in the graph data and persisted with the graph."
    },
    {
      "ID": "UI-35",
      "name": "Action messages",
      "type": "UI",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": -27.8122,
        "z": 0.01
      },
      "description": "Mindshare confirms or explains the result of an action with a short message at the bottom right of the screen, on top of the Detail panel if it is open, such as Graph was persisted on the server, Link was copied, Picture was uploaded or Undone.\n\nMessages close by themselves after a few seconds and do not block work, so a person always knows whether an action succeeded. A few short hints appear at the bottom centre instead."
    },
    {
      "ID": "Feature-what-is-remembered",
      "name": "What is remembered",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Everywhere",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 9.6536,
        "y": 28.4043,
        "z": 0.01
      },
      "description": "Mindshare keeps three kinds of memory. Persist on server and Download keep the graph itself: nodes, links, properties, types, positions, sizes, Detail settings, the name and description, hidden links and the source link. A Share link to my view also carries the camera, the open Detail panel and the active filters, but not a selection's filter.\n\nZones, including docked ones, Movements, selection toolboxes, glow, grid and snap, Node Opacity, Fill small nodes, Arrange settings, panel width, the legend and undo history last only while the page is open. The password is kept on the server and can never be read back, and the app keeps nothing in the browser across reloads. Knowing this tells a person what to persist and what to send."
    },
    {
      "ID": "Feature-limits-and-quirks",
      "name": "Limits and quirks",
      "type": "Feature",
      "properties": {
        "Area": "Overview",
        "Where": "Everywhere",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 17.74,
        "y": -13.8399,
        "z": 0.01
      },
      "description": "A few things work differently from what people expect. Changes that are not persisted are lost on reload, and the app has no list of graphs, so people keep the address. Without a password anyone with a graph's link can replace it, a password cannot be added later and it protects replacing and deleting, not opening.\n\nApply changes does not persist, and a new name waits for the next persist. A link's two nodes cannot be changed, zones, Movements and saved selections are not saved, duplicate node IDs are not caught on import, and resizing works on one node at a time. Knowing these avoids surprises."
    },
    {
      "ID": "Message-upload-successful",
      "name": "Upload successful",
      "type": "Message",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 25.4573,
        "z": 0.01
      },
      "description": "When pasted JSON or a local file passes the check, Visualize opens the graph on the canvas. A check that fails shows Upload unsuccessful instead."
    },
    {
      "ID": "Message-upload-unsuccessful",
      "name": "Upload unsuccessful",
      "type": "Message",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 30.4573,
        "z": 0.01
      },
      "description": "When imported data breaks a rule, the Your data box stops and shows Upload unsuccessful, Error parsing data, followed by the reason: for example an undeclared property, a number written as text, properties in a different order within a type, a link to a missing node, an unknown shape or broken JSON.\n\nThe person fixes what the message names, and typing in the box clears it. Because the check runs before anything is stored, a broken graph never replaces anything."
    },
    {
      "ID": "Message-arranging-your-graph",
      "name": "Arranging your graph",
      "type": "Message",
      "properties": {
        "Area": "Getting in",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 36.6313,
        "z": 0.01
      },
      "description": "This message no longer appears when a graph first opens, where one loading animation has taken its place. It remains only for long arrangements started from Arrange nodes."
    },
    {
      "ID": "Message-no-data-available",
      "name": "No data available",
      "type": "Message",
      "properties": {
        "Area": "Getting in",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 27.9573,
        "z": 0.01
      },
      "description": "When the canvas is opened without a graph, for example after reloading a graph that was never persisted, it shows No data available with a link to go home. The message is a reminder that work that is not persisted does not survive a reload."
    },
    {
      "ID": "Message-arranged-n-nodes",
      "name": "Arranged N nodes",
      "type": "Message",
      "properties": {
        "Area": "Layout",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": -7.4291,
        "z": 0.01
      },
      "description": "After Arrange nodes or a Movement, a line in the pop-up says how many nodes were arranged, or Nothing moved when the same settings are applied again. The result is also announced to screen readers. The count confirms that the scope was the one intended."
    },
    {
      "ID": "Feature-51",
      "name": "Canvas image",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Top toolbar",
        "Shortcut": "Shift+Cmd/Ctrl+I",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 26.9217,
        "y": 18.2064,
        "z": 0.01
      },
      "description": "A picture can be placed directly on the canvas as its own node, for example a screenshot beside the nodes that explain it. Mindshare labels it with its file name and sizes it from its pixels, and it can be moved, resized and linked like any node.\n\nWithout a click position it lands in the centre of the canvas. In the data it is a node of type image drawn as a canvas picture, with the picture ID as its image."
    },
    {
      "ID": "UI-28",
      "name": "Add picture button",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Top toolbar",
        "Shortcut": "Option/Alt+Shift+P",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 11.2483,
        "y": 51.3003,
        "z": 0.01
      },
      "description": "The Add picture button in the top toolbar opens a file picker, or takes a file dropped on it, and places the picture on the canvas as a canvas picture. It appears only on servers that store pictures."
    },
    {
      "ID": "Feature-add-image",
      "name": "Add image",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Right-click menu",
        "Shortcut": "Shift+Cmd/Ctrl+I",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 31.7388,
        "y": 20.8961,
        "z": 0.01
      },
      "description": "Besides the Add picture button, a person can right-click empty canvas and choose Add image, which places the picture where they clicked, or press Shift+Cmd+I, or Ctrl+Shift+I on Windows. The picture becomes its own node on the canvas, labelled with its file name and sized from its pixels."
    },
    {
      "ID": "Feature-85",
      "name": "Paste a picture",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Canvas",
        "Shortcut": "Cmd/Ctrl+V",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [2.5, 1.5],
      "position": {
        "x": 30.769,
        "y": 18.6887,
        "z": 0.01
      },
      "description": "When a picture is already on the clipboard, the person pastes it. With nothing selected it becomes a canvas picture; with a node's Detail panel open it joins that node's gallery. Pasting works on persisted graphs only, so a person persists before pasting."
    },
    {
      "ID": "Feature-64",
      "name": "Add pictures",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Detail panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 28.3885,
        "y": 15.8223,
        "z": 0.01
      },
      "description": "When a node needs illustrations, the person opens its Detail panel on a persisted graph and presses Add pictures, choosing several files at once; they join the node's gallery in the chosen order. Pasting an image while the panel is open does the same."
    },
    {
      "ID": "Feature-50",
      "name": "Gallery",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Detail panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 28.0109,
        "y": 13.2812,
        "z": 0.01
      },
      "description": "A node's gallery holds its pictures and YouTube videos in order. The Detail panel shows it as a strip of thumbnails, a gallery view and a large view, which is the only place where animated pictures move and the original file loads. Galleries turn a node into a small illustrated page."
    },
    {
      "ID": "Feature-remove-from-a-gallery",
      "name": "Remove from a gallery",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 30.974,
        "y": 8.0382,
        "z": 0.01
      },
      "description": "When a picture no longer belongs to a node, the person opens Edit node, goes to Gallery and uses the remove handle on its thumbnail; the change applies on Apply changes and can be undone. The stored picture is not deleted, so other nodes and graphs that use it keep it."
    },
    {
      "ID": "Feature-49",
      "name": "Cover image",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Edit node",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 23.8418,
        "y": 15.6147,
        "z": 0.01
      },
      "description": "When a picture says more than a label, the person opens Edit node, goes to Gallery and tags one of the node's own pictures with Use as cover image.\n\nThe node then shows the picture inside its shape instead of its name, while the name still titles the Detail panel and is still found by search; Show name instead goes back. Covers work on circles, rectangles, hexagons and polygons, not on stars, canvas pictures or YouTube links."
    },
    {
      "ID": "Feature-63",
      "name": "Embedded videos",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 28.0325,
        "y": 10.6854,
        "z": 0.01
      },
      "description": "A node's gallery can hold YouTube videos that show as thumbnails and play inside the gallery. Videos are not uploaded to Mindshare: the YouTube links are written into the graph data, as there is no button to add one."
    },
    {
      "ID": "Data model-picture-values",
      "name": "Picture values",
      "type": "Data model",
      "properties": {
        "Area": "Pictures",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 21.2858,
        "y": 7.2914,
        "z": 0.01
      },
      "description": "In the graph data, a picture in a gallery or a cover is written as its picture ID, the normal way, so Mindshare loads it from its own Media Module in the size that fits.\n\nOlder graphs may use outside web addresses, which load as they are but are not managed or counted by the Media Module, and galleries may hold YouTube links; anything else shows the Picture unavailable placeholder. A cover is written both in the gallery and as the node's cover."
    },
    {
      "ID": "Feature-reusing-a-picture",
      "name": "Reusing a picture",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 33.951,
        "y": 1.8243,
        "z": 0.01
      },
      "description": "The same picture can appear several times, in several nodes and in other graphs on the same server, because every use stores the same picture ID. A logo or screenshot is uploaded once and used everywhere."
    },
    {
      "ID": "Feature-picture-files-and-sizes",
      "name": "Picture files and sizes",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 29.4785,
        "y": 1.125,
        "z": 0.01
      },
      "description": "Mindshare accepts PNG, JPEG, GIF, WebP and AVIF files up to 25 MB and 50 million pixels, and a refused picture says why.\n\nOn upload the server turns the picture upright, removes location and camera details, and keeps a strip, a gallery and a canvas size beside the original, so the app always loads the smallest version that fits. Transparency and animation are kept, except that an animated AVIF is kept as a still picture."
    },
    {
      "ID": "Feature-upload-limits",
      "name": "Upload limits",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 32.7846,
        "y": 10.7435,
        "z": 0.01
      },
      "description": "To protect the server, uploads are limited: by default 100 per sender in 24 hours, 20 per minute, 2,000 pictures or 5 GB a day for everyone together, and 200 GB of storage in total. When a limit is reached, uploads stop with Uploads are paused, try later, while viewing pictures keeps working. The server owner can change these settings."
    },
    {
      "ID": "Message-36",
      "name": "Picture was uploaded",
      "type": "Message",
      "properties": {
        "Area": "Pictures",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 1.9874,
        "z": 0.01
      },
      "description": "While a picture uploads, a message reads Uploading picture, then Picture was uploaded. Like other messages it appears at the bottom right and closes by itself. A picture that fails gives Picture not uploaded with the reason instead."
    },
    {
      "ID": "Message-uploads-are-paused",
      "name": "Uploads are paused",
      "type": "Message",
      "properties": {
        "Area": "Pictures",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 11.5248,
        "z": 0.01
      },
      "description": "When an upload limit is reached, a notice says Uploads are paused, try later. Pictures already stored keep showing; the person waits until the limit window has passed and uploads again."
    },
    {
      "ID": "Message-picture-unavailable",
      "name": "Picture unavailable",
      "type": "Message",
      "properties": {
        "Area": "Pictures",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 50.4829,
        "y": 9.0248,
        "z": 0.01
      },
      "description": "When a picture was deleted, belongs to another server, or the server has pictures switched off, its place shows a grey Picture unavailable placeholder, inside a node only the icon. The graph still opens and persists normally, and the placeholder can be removed from the gallery or replaced as the cover."
    },
    {
      "ID": "Feature-picture-ids",
      "name": "Picture IDs",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 26.3083,
        "y": 8.0076,
        "z": 0.01
      },
      "description": "A picture ID only works on the server where the picture was uploaded. When a graph file moves to another Mindshare server its IDs travel with it, but the pictures show only after they are uploaded there again, which gives new IDs. A person writing graph data finds an ID in the Media console with Copy Picture ID, or in a downloaded graph that contains the picture."
    },
    {
      "ID": "Feature-picture-usage",
      "name": "Picture usage",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 30.6556,
        "y": 4.6081,
        "z": 0.01
      },
      "description": "When a graph is persisted, the server records which pictures it uses as canvas pictures, in galleries or as covers; this is what the Media console shows as Used in. A picture uploaded into a graph that is never persisted counts as Never used and may be deleted, and a picture no graph has used for 30 days can be cleaned up, so a person persists after adding pictures."
    },
    {
      "ID": "UI-privacy-page",
      "name": "Privacy page",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Privacy page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 38.4567,
        "y": 1.8245,
        "z": 0.01
      },
      "description": "The Privacy page exists on its own: nothing in the app links to it. It explains that anyone with a picture's link can see it, that the sender's network address is kept only in pseudonymised form for 30 days, and how to report a picture that breaks the law or someone's rights. Private pictures are therefore not uploaded."
    },
    {
      "ID": "UI-media-console",
      "name": "Media console",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Media console",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 35.7474,
        "y": 7.3741,
        "z": 0.01
      },
      "description": "The server owner manages stored pictures on a password-protected page that is not linked from the app and is off until a console password is set. A sign-in lasts 8 hours in that tab and too many wrong attempts lock it for 15 minutes.\n\nIts tabs show the Library, pictures that were Never used, a daily Clean-up report, Storage against the limits and an Audit log. Deleting is permanent: deleting a picture that is in use names the graphs it will break and asks for the word delete, and those graphs then show Picture unavailable."
    },
    {
      "ID": "UI-library",
      "name": "Library",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Media console",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 32.8796,
        "y": 13.3858,
        "z": 0.01
      },
      "description": "The Library tab of the Media console shows every stored picture, newest first, with search by file name or picture ID, filters by type, size, upload date, usage and graph, and a usage badge on each thumbnail.\n\nOpening a picture shows its preview, the original, the Picture ID with a copy button, its sizes, upload time and the graphs it is Used in, which is the easiest way to find an ID for writing graph data."
    },
    {
      "ID": "UI-never-used",
      "name": "Never used",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Media console",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 37.6672,
        "y": 10.1084,
        "z": 0.01
      },
      "description": "The Never used tab of the Media console lists pictures that were uploaded but never persisted in any graph, oldest first, each with its own Delete; pictures from the last hour are marked Just uploaded so a person still working is not cut off."
    },
    {
      "ID": "UI-clean-up",
      "name": "Clean-up",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Media console",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 35.1991,
        "y": 4.6121,
        "z": 0.01
      },
      "description": "The Clean-up tab of the Media console shows a daily report of pictures no graph has used for 30 days or more. The owner ticks and deletes them, with a limit per run, and pictures used again since the report are skipped."
    },
    {
      "ID": "UI-storage",
      "name": "Storage",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Media console",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 37.3719,
        "y": 12.7904,
        "z": 0.01
      },
      "description": "The Storage tab of the Media console shows space used against the 200 GB ceiling, uploads in the last 24 hours against the daily limits, whether uploads are open or paused and why, the largest pictures and the graphs using the most space."
    },
    {
      "ID": "UI-audit-log",
      "name": "Audit log",
      "type": "UI",
      "properties": {
        "Area": "Pictures",
        "Where": "Media console",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 39.7329,
        "y": 4.6148,
        "z": 0.01
      },
      "description": "The Audit log tab of the Media console records sign-ins, failed sign-ins, deletions and clean-ups with a short fingerprint of the source, never the address itself, so the owner can see who changed the picture store."
    },
    {
      "ID": "Feature-56",
      "name": "APIs",
      "type": "Feature",
      "properties": {
        "Area": "Data and integration",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 23.9104,
        "y": 28.2364,
        "z": 0.01
      },
      "description": "Integration APIs connect other applications to Mindshare: a program can create graphs, read them back by ID, and upload pictures automatically to the Media Module, so graphs can be produced and refreshed without anyone pasting text.\n\nThe API tile on the start page gives ready-to-copy examples. The server does not check graphs sent this way, only the Your data box does, so a program checks its graph first; and graphs cannot be listed, only opened by ID."
    },
    {
      "ID": "Feature-model-creation-through-the-api",
      "name": "Graph creation through the API",
      "type": "Feature",
      "properties": {
        "Area": "Data and integration",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 26.4705,
        "y": 25.8518,
        "z": 0.01
      },
      "description": "When a program produces a graph, it can send it straight to the server with its name and data and receive the new graph's ID and address, without the start page. The name can be chosen freely, and the request may be up to 32 MB.\n\nThe data must be in the persisted shape, with the type looks keyed by type, and nothing is validated, so the graph is checked beforehand. A password can be sent with it: with one, replacing or deleting the graph needs the password; without one, anyone with the link can replace it."
    },
    {
      "ID": "Feature-picture-upload-through-the-api",
      "name": "Picture upload through the API",
      "type": "Feature",
      "properties": {
        "Area": "Data and integration",
        "Where": "Server",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 25.8609,
        "y": 30.5158,
        "z": 0.01
      },
      "description": "Pictures can be imported automatically: a program sends each file to the Media Module of the server and receives its picture ID, which it then writes into the graph data.\n\nThe same file types, sizes and upload limits apply as in the app, and a health check tells whether uploads are open or paused for everyone together, while the per-sender limits show only as a refused upload. This is how a large set of screenshots or post images is attached to a generated graph without uploading them one by one."
    },
    {
      "ID": "Data model-graph-file-shapes",
      "name": "Graph file shapes",
      "type": "Data model",
      "properties": {
        "Area": "Data and integration",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 26.6774,
        "y": 23.4215,
        "z": 0.01
      },
      "description": "The same graph exists in three shapes. The import and download file is what people paste, load and download, with the type looks as a list; the persisted graph on the server wraps the graph with its ID and name and keys the type looks by type; and the app holds a third, temporary form in memory.\n\nOnly the first can be put in the Your data box, so a persisted graph is turned back into the file shape before it is imported again."
    },
    {
      "ID": "Data model-detail-settings-data",
      "name": "Detail settings data",
      "type": "Data model",
      "properties": {
        "Area": "Data and integration",
        "Where": "Detail settings",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 26.3981,
        "y": 20.625,
        "z": 0.01
      },
      "description": "Detail settings are stored per node type in the graph data: which properties a type shows in its own panel, which it shows as a connected node, and the order of connected types.\n\nA default entry for all types applies wherever a type has no entry of its own, and an entry for a type replaces the default completely. Without any entry the Detail panel shows no properties at all, and old detail fields from earlier versions are ignored."
    },
    {
      "ID": "Data model-what-import-does-not-check",
      "name": "What import does not check",
      "type": "Data model",
      "properties": {
        "Area": "Data and integration",
        "Where": "Data only",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": false
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 31.2498,
        "y": 24.1599,
        "z": 0.01
      },
      "description": "The import refuses broken data but lets three things through: two nodes with the same ID, a link from a node to itself, and two identical links between the same pair. Unknown extra fields on nodes and links are carried along and do nothing, while unknown top-level fields are dropped. Whoever writes graph data keeps IDs unique and links single."
    },
    {
      "ID": "Actions-74",
      "name": "Highlight related concepts",
      "type": "Actions",
      "properties": {
        "Area": "Navigation"
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 9.8074,
        "y": -34.1184,
        "z": 0.00999999999998579
      },
      "description": "When a person wants to focus an audience on part of the graph, or to see better how concepts are connected, they use one of the highlighting mechanisms: point at a node to light up its neighbours, click to step the rest of the graph back, double-click to fly there with a pulse, or turn on Glow to see where each type lives."
    },
    {
      "ID": "Actions-75",
      "name": "Reveal information",
      "type": "Actions",
      "properties": {
        "Area": "Filtering"
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -12.8099,
        "y": 18.4975,
        "z": 0.01
      },
      "description": "When too much is shown at once, a person hides part of the graph and reveals it at the right moment. Filters, the legend and Node Opacity fade what is not needed, toggling a filter brings it back, and Movements replay an arrangement step by step, so a presentation can build up a picture piece by piece."
    },
    {
      "ID": "Actions-76",
      "name": "Keep context visible",
      "type": "Actions",
      "properties": {
        "Area": "Filtering"
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -20.9382,
        "y": 26.1503,
        "z": 0.00999999999998579
      },
      "description": "When a filter narrows the graph, a reader still wants to see what the matching nodes touch. Show connected nodes keeps their neighbours visible, Node Opacity can leave filtered-out nodes faintly visible instead of hidden, and hover still follows every link, so focus never costs the surrounding picture."
    },
    {
      "ID": "Actions-77",
      "name": "Batch edit",
      "type": "Actions",
      "properties": {
        "Area": "Editing"
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 15.2354,
        "y": -35.901,
        "z": 0.01
      },
      "description": "Editing a graph node by node can be slow. Inside the app, a Transform zone changes a property on many nodes in one drop and Copy properties gives many nodes the same size or the same property value; for larger changes a person downloads the graph, edits the JSON in a text editor or a script and imports it again as a new graph."
    },
    {
      "ID": "Actions-79",
      "name": "Move nodes",
      "type": "Actions",
      "properties": {
        "Area": "Layout"
      },
      "size": [3.75, 1.5],
      "position": {
        "x": -20.433,
        "y": 9.4203,
        "z": 0.010000000000028422
      },
      "description": "When the graph's arrangement no longer tells its story, a person moves nodes: drag one node or a selection with snapping, line up a few with Align and Distribute, rearrange many at once with Arrange nodes, collect them with a Portal zone, or show the change as a Movement. All of these can be undone, and the new positions are persisted."
    },
    {
      "ID": "Actions-80",
      "name": "Add details to node",
      "type": "Actions",
      "properties": {
        "Area": "Editing"
      },
      "size": [3.75, 1.5],
      "position": {
        "x": 18.3558,
        "y": -28.6193,
        "z": 0.01
      },
      "description": "When a node needs more than its name, a person opens Edit node to write a description and fill in its properties, adds pictures to its gallery or picks a cover, and links it to related nodes with well-named links. Everything added this way shows in the Detail panel and keeps the canvas clean."
    },
    {
      "ID": "Use Case-website-project",
      "name": "A Website Project",
      "type": "Use Case",
      "properties": {
        "Area": "Use cases",
        "Page": "/en/use-cases/website-project-showcase",
        "Category": "SOFTWARE"
      },
      "size": 2.5,
      "position": {
        "x": 0.9713,
        "y": 17.9738,
        "z": 0.01
      },
      "description": "A web project leaves its story scattered across calls, documents, design files and chat channels, so this showcase puts one sample project on one page: the 68 days from the first call to the accepted website, with every meeting, task, decision and deliverable, the roles who did the work and the client's feedback at the end. Items are placed left to right on a timeline through three phases, brand identity, web design and web implementation, and each carries its date and project day as properties of twelve node types.\n\nA reader can see what the client handed over, how the logo was chosen, why the platform was picked and what the client would change, by filtering the legend by type, double-clicking to fly to a node, opening the Detail panel and keeping logo versions as pictures on the map; a share link reopens the same node and filters. The data is illustrative.\n\nUse case page: /en/use-cases/website-project-showcase"
    },
    {
      "ID": "Use Case-ukraine-war",
      "name": "The Russo-Ukrainian War",
      "type": "Use Case",
      "properties": {
        "Area": "Use cases",
        "Page": "/en/use-cases/ukraine-war-showcase",
        "Category": "RESEARCH"
      },
      "size": 2.5,
      "position": {
        "x": 12.3172,
        "y": -13.1258,
        "z": 0.01
      },
      "description": "News reports a war one day at a time and hides the chain from cause to consequence, so this showcase lays twelve years, from Euromaidan to October 2026, on one timeline with a row for each field the events changed: intelligence, diplomacy, front line, weapons, aid, energy, sanctions, humanitarian and justice.\n\nArrows run from cause to consequence and a link property says whether a source states the connection or it was inferred, and why; node size shows impact, and news articles and quotes sit beside the events. A reader follows the invasion into every row, filters the legend by type, double-clicks to fly to a node and shares a link that reopens the same node and filters. The data is real and researched, with contested claims attributed.\n\nUse case page: /en/use-cases/ukraine-war-showcase"
    },
    {
      "ID": "Use Case-82",
      "name": "A Jira Project, Untangled",
      "type": "Use Case",
      "properties": {
        "Area": "Use cases",
        "Page": "/en/use-cases/jira-project-showcase",
        "Category": "SOFTWARE"
      },
      "size": 2.5,
      "position": {
        "x": 13.0471,
        "y": 12.4005,
        "z": 0.01
      },
      "description": "A Jira board shows one sprint at a time and a dependency hides in a link that has to be opened, so this showcase turns a simulated Jira project into a Mindshare import and puts the whole project on one timeline: eight teams as rows, six sprints as bars across the top and every issue placed by date and sized by its story points.\n\nParent links climb from issue to feature, epic and initiative, blocking links run between team rows and comment threads hang off their issues. A reader finds what holds up the pilot, where the bottleneck is and which work nobody planned for, by filtering on properties such as status, flagged or open blockers, filtering the legend by type, double-clicking to fly to a node and sharing a link with the same node and filters. The data is illustrative.\n\nUse case page: /en/use-cases/jira-project-showcase"
    },
    {
      "ID": "Use Case-agent-session",
      "name": "Three days with a coding agent",
      "type": "Use Case",
      "properties": {
        "Area": "Use cases",
        "Page": "/en/use-cases/agent-session-showcase",
        "Category": "SOFTWARE"
      },
      "size": 2.5,
      "position": {
        "x": -5.1006,
        "y": 17.2622,
        "z": 0.01
      },
      "description": "After three days of a product owner working with a team of coding agents, all that is left is a transcript, a git history and a feeling it took longer than it should, so this showcase lays every prompt, reply, decision, mistake and commit on one timeline, each connected to what caused it and what it led to.\n\nFour lanes separate boxes as wide as they lasted, commits and deliverables, what the agents did as hexagons and what the product owner did as stars, and a picture shows one reply as the wall of text it was. A reader sees who decided what, where the time went, who caught the mistakes and whether the estimates held, by narrowing on property conditions and double-clicking to fly to a node; such a graph can be imported as JSON. The data is illustrative, with proportions taken from real sessions.\n\nUse case page: /en/use-cases/agent-session-showcase"
    },
    {
      "ID": "Use Case-trial-of-humanity",
      "name": "Trial of Humanity",
      "type": "Use Case",
      "properties": {
        "Area": "Use cases",
        "Page": "/en/use-cases/trial-of-humanity",
        "Category": "CULTURE"
      },
      "size": 2.5,
      "position": {
        "x": 6.867,
        "y": 16.6387,
        "z": 0.01
      },
      "description": "Science fiction keeps staging the same scene, a superior power asking whether humanity deserves to survive, so this showcase compares 53 such trials from 1944 to 2022 and eight real-world messages to the cosmos on one map around a central question. Every trial is broken into the same typed parts, charge, judge, advocate, argument, form and verdict, each placed once and connected to every story that uses it, and numeric properties count how often an argument was made and how often humanity was spared.\n\nA reader learns which arguments win and whether deeds beat words by narrowing on those numbers, filtering the legend by type, double-clicking to fly to a node, opening the Detail panel with posters and portraits, and sharing a link with the same node and filters. The works and events are real.\n\nUse case page: /en/use-cases/trial-of-humanity"
    },
    {
      "ID": "UI-featured-use-case",
      "name": "Featured use case",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "The first tile on the start page shows one finished example with an Open graph button, so a newcomer sees a real graph in one click. It is the use case the website has marked as featured; if none is marked, the first use case that has a graph is shown.",
      "position": {
        "x": 4.187,
        "y": 46.2,
        "z": 0.01
      }
    },
    {
      "ID": "UI-use-case-list",
      "name": "Use case list",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "The start page lists the website's use cases as rows, and a click opens one as the persisted graph itself at its own address. Because each has a password set by Mindshare, a visitor cannot replace it: changes stay in the tab, and persisting them makes a graph of the person's own. This lets people explore freely without harming the example.",
      "position": {
        "x": 6.059,
        "y": 21.013,
        "z": 0.01
      }
    },
    {
      "ID": "UI-template-cards",
      "name": "Template cards",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a person wants to start from a pattern rather than from nothing, they click a template card on the start page. Like a use case, a template opens as the persisted graph itself and has a password set by Mindshare, so the person's changes stay in the tab until persisting makes a graph of their own.",
      "position": {
        "x": 4.187,
        "y": 41.4,
        "z": 0.01
      }
    },
    {
      "ID": "UI-api-tile",
      "name": "API tile",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When graphs should come from a program or an AI agent, the API tile on the start page gives ready-to-copy examples on four tabs: curl, JavaScript, Python and AI agent. A line under them says a password can be sent to protect the graph, and the Mindshare Metadata link explains how a graph file is built. The examples send to the production server and show no key, so copying one sends there.",
      "position": {
        "x": 19.016,
        "y": 30.398,
        "z": 0.01
      }
    },
    {
      "ID": "UI-your-data-box",
      "name": "Your data box",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a person has their own graph, they put its JSON in the Your data box on the start page: pasted, loaded with Local File or dropped on the box. The contents stay visible in the box, so they can be seen before anything opens, and Visualize then opens the graph. It accepts a file of up to 3 MB, and the check runs in the browser, so nothing reaches the server until Persist on server.",
      "position": {
        "x": 18.091,
        "y": 33.168,
        "z": 0.01
      }
    },
    {
      "ID": "UI-visualize-button",
      "name": "Visualize button",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "The Visualize button opens what is in the Your data box as a graph on the canvas. It stays grey and does nothing while the box is empty, and turns green and glows, with a ring turning round its edge, once the box holds something, so a person sees at once that the next step is ready.",
      "position": {
        "x": 18.091,
        "y": 35.568,
        "z": 0.01
      }
    },
    {
      "ID": "UI-local-file-button",
      "name": "Local File button",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When the graph is in a file, the person chooses Local File and picks it. The file's contents appear in the Your data box rather than opening at once, so they can be looked at first, and the opened graph takes the file's name without .json.",
      "position": {
        "x": 13.139,
        "y": 16.913,
        "z": 0.01
      }
    },
    {
      "ID": "UI-example-button",
      "name": "Example button",
      "type": "UI",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a person wants to try the app before they have data, Example puts a tiny sample in the Your data box. It only fills the box; Visualize then opens it as Example graph.",
      "position": {
        "x": 22.891,
        "y": 33.168,
        "z": 0.01
      }
    },
    {
      "ID": "Message-graph-not-available-yet",
      "name": "Graph not available yet",
      "type": "Message",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When the website lists a use case or template that has no graph, its item is dimmed and says Graph not available yet, so a person does not click into nothing.",
      "position": {
        "x": 8.49,
        "y": 35.428,
        "z": 0.01
      }
    },
    {
      "ID": "Message-this-file-cant-be-opened",
      "name": "This file can't be opened",
      "type": "Message",
      "properties": {
        "Area": "Getting in",
        "Where": "Start page",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a file cannot be used, the Your data box says why and stays as it was: This file is over 3 MB, so it can't be opened here, or This file couldn't be read, so it can't be opened here. Each message asks for another JSON file, so the person knows what to try next.",
      "position": {
        "x": 7.941,
        "y": 11.931,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-loading-animation",
      "name": "Loading animation",
      "type": "Feature",
      "properties": {
        "Area": "Node types and look",
        "Where": "Everywhere",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "While a page or a graph loads, or a large graph without positions is arranged, one calm loading animation shows in the middle of the window. The same animation appears in buttons and messages that are working, so waiting always looks the same. With reduced motion it is a calm still version.",
      "position": {
        "x": -11.28,
        "y": -0.036,
        "z": 0.01
      }
    },
    {
      "ID": "UI-title-panel",
      "name": "Title panel",
      "type": "UI",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Title panel",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "The title panel at the top left shows a blue M and the graph's name, followed by a small lock if the graph has a password. A click on the name opens the graph's info, and a click on the M goes back to the start page, asking first if there are changes that are not persisted. It tells a person at any moment which graph they are in.",
      "position": {
        "x": 13.505,
        "y": 8.344,
        "z": 0.01
      }
    },
    {
      "ID": "UI-graph-info",
      "name": "Graph info",
      "type": "UI",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Title panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a person wants to know what a graph is, they click its name in the title panel. The info shows the description, up to 280 characters, how many nodes, links, types and pictures the graph has, and Details with the rows Persisted, Created, From, Source, Address and Password.\n\nEdit changes the name and description, and Apply or Enter takes them over while Escape or Cancel drops them. A graph with a password also offers Delete graph here.",
      "position": {
        "x": 3.927,
        "y": 26.364,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-graph-password",
      "name": "Graph password",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Title panel",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "The first time a graph is persisted, a dialog asks whether to protect it. The person chooses Persist without password, or types a password, repeats it and chooses Persist with password.\n\nA password protects replacing and deleting, not opening: anyone with the link can still look. It cannot be added later, and nobody can read it back, so a forgotten one can only be set anew by the Mindshare admin. Use cases and templates carry a password set by Mindshare.",
      "position": {
        "x": 1.751,
        "y": 14.01,
        "z": 0.01
      }
    },
    {
      "ID": "Message-password-needed",
      "name": "Password needed",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "Because the app never keeps a password, the Password needed dialog asks for it each time a protected graph is persisted. Cancel keeps the changes in the tab, so nothing is lost by stepping away.",
      "position": {
        "x": 13.545,
        "y": 34.149,
        "z": 0.01
      }
    },
    {
      "ID": "Message-wrong-password",
      "name": "Wrong password",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When the password does not match, the message says Wrong password and that nothing was persisted, or that the graph was not deleted. After too many wrong tries the app asks the person to wait a few minutes, which protects the graph from guessing.",
      "position": {
        "x": 40.426,
        "y": 7.793,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-delete-graph",
      "name": "Delete graph",
      "type": "Feature",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Title panel",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a protected graph is no longer wanted, the person opens its info, chooses Delete graph at the foot of the Details, types the password and confirms. The start page then says Graph deleted.\n\nDeleting is permanent, and the pictures only that graph used go with it. A graph without a password cannot be deleted this way; only the Mindshare admin can.",
      "position": {
        "x": 13.91,
        "y": 5.564,
        "z": 0.01
      }
    },
    {
      "ID": "Message-changes-not-persisted",
      "name": "Changes not persisted",
      "type": "Message",
      "properties": {
        "Area": "Saving and sharing",
        "Where": "Title panel",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a person clicks the M with changes that are not persisted, a question offers Keep editing, Discard changes and Persist and leave. This stops work in the tab from being lost by going home. If every change was undone first, the graph counts as unchanged and nothing is asked.",
      "position": {
        "x": 13.241,
        "y": 3.035,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-edit-link",
      "name": "Edit link",
      "type": "Feature",
      "properties": {
        "Area": "Links",
        "Where": "Edit link",
        "Shortcut": "",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a link needs changing, the person right-clicks it and chooses Edit link, or points at the connection in a Detail panel and clicks the three dots. The panel docks on the right and changes the names, the direction, the properties and whether the link is drawn.\n\nApply changes takes it over, and a short message confirms with an Undo button. A link's two nodes cannot be changed, so connecting different nodes means deleting the link and adding a new one.",
      "position": {
        "x": 36.562,
        "y": -11.447,
        "z": 0.01
      }
    },
    {
      "ID": "UI-apply-changes",
      "name": "Apply changes",
      "type": "UI",
      "properties": {
        "Area": "Editing",
        "Where": "Right dock",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "The editing panels end in Apply changes, which takes the edit into the graph in the browser tab. It does not send anything to the server, because only Persist on server does that. The two words keep apart what a person has changed from what is safely kept.",
      "position": {
        "x": 18.568,
        "y": -7.232,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-fill-small-nodes",
      "name": "Fill small nodes",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+V",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a large graph is zoomed far out, labels become too small to read. Fill small nodes on the left toolbar has a slider with six stops, Off, Smallest, Small, Medium, Large and Largest: a node drawn smaller than the chosen size is shown filled with its type colour, in its own shape, without its name or picture.\n\nThe button turns blue while it is on. A filled node can still be pointed at and selected. The setting starts at Off each time a graph opens and lasts only while the page is open.",
      "position": {
        "x": 0.445,
        "y": -14.03,
        "z": 0.01
      }
    },
    {
      "ID": "Message-zoomed-out-as-far-as-it-goes",
      "name": "Zoomed out as far as it goes",
      "type": "Message",
      "properties": {
        "Area": "Navigation",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a reader reaches the furthest view and zooms out once more with the wheel or a trackpad pinch, a hint at the bottom centre says Zoomed out as far as it goes, so the reader knows the app has not stopped responding.",
      "position": {
        "x": 26.614,
        "y": -28.592,
        "z": 0.01
      }
    },
    {
      "ID": "UI-align-toolbar",
      "name": "Align toolbar",
      "type": "UI",
      "properties": {
        "Area": "Layout",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When two or more nodes are selected, a small toolbar appears above them with six Align commands and two Distribute commands, and beside it the square that saves the selection. It closes on a click elsewhere or Escape, so tools appear only while there is something to act on.",
      "position": {
        "x": -10.285,
        "y": -16.239,
        "z": 0.01
      }
    },
    {
      "ID": "UI-save-selection-square",
      "name": "Save selection square",
      "type": "UI",
      "properties": {
        "Area": "Selection",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "Beside the Align toolbar sits a small square with a floppy-disk symbol in a dashed frame. Dragged to the bottom of the screen, it shows a small picture of the selection and opens a gap in the bottom dock where the toolbox will land.\n\nA person who cannot drag focuses it and presses Enter or Space, or clicks it. Escape or letting go outside the dock cancels.",
      "position": {
        "x": -10.285,
        "y": -13.839,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-selection-toolbox",
      "name": "Selection toolbox",
      "type": "Feature",
      "properties": {
        "Area": "Selection",
        "Where": "Bottom dock",
        "Shortcut": "",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a group of nodes is needed again and again, the person keeps it as a small toolbox in the bottom dock, named Selection 1, Selection 2 and so on. The toolbox shows the name, a small map of where the nodes sit, a count and a cross.\n\nA click on the map selects the nodes again and Shift adds them to the selection; the name can be changed, up to 20 characters. Only nodes are kept, and if some were deleted a recall says how many remain. Toolboxes last only while the page is open and are not persisted, downloaded or put in a share link.",
      "position": {
        "x": 6.027,
        "y": -14.497,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-selection-filter",
      "name": "Selection filter",
      "type": "Feature",
      "properties": {
        "Area": "Filtering",
        "Where": "Bottom dock",
        "Shortcut": "",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a reader wants the graph narrowed to a saved group, they click the count on its toolbox. The other nodes fade and a filter reading Selection followed by the node count appears in the Active filters panel; another click switches it off. A share link leaves this filter out.",
      "position": {
        "x": -7.549,
        "y": 10.564,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-toolbar-keys",
      "name": "Toolbar keys",
      "type": "Feature",
      "properties": {
        "Area": "Navigation",
        "Where": "Everywhere",
        "Shortcut": "Option/Alt+Shift+letter",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "Every button on the top bar and the left toolbar has its own key: Option with Shift and a letter on a Mac, Alt with Shift and a letter on Windows. Pressing it once does the same as a click and pressing it again closes or switches off.\n\nHovering a button shows its name and key in a tooltip, so a person learns the keys while working. Undo, Redo and Persist on server keep their Cmd/Ctrl keys.",
      "position": {
        "x": -12.398,
        "y": 8.418,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-dock-a-zone",
      "name": "Dock a zone",
      "type": "Feature",
      "properties": {
        "Area": "Zones",
        "Where": "Bottom dock",
        "Shortcut": "",
        "Remembered": "Session",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "To keep a zone within reach while moving around, the person clicks the first icon at its top right or drags it towards the bottom of the screen until a dock target lights up. The zone becomes a small bar in the bottom dock with its name, a coloured handle, a settings button and a cross, and nodes dropped on the handle are treated as if dropped on the zone.\n\nA docked Container zone takes its nodes off the canvas until it is restored. Dragging the handle up, Enter or Space on it, or Restore to canvas in the bar's menu returns the zone to its exact earlier size and place. Docking is not an undo step and is forgotten on reload.",
      "position": {
        "x": -14.259,
        "y": 5.136,
        "z": 0.01
      }
    },
    {
      "ID": "UI-zones-panel",
      "name": "Zones panel",
      "type": "UI",
      "properties": {
        "Area": "Zones",
        "Where": "Left toolbar",
        "Shortcut": "Option/Alt+Shift+Z",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "Zones on the left toolbar opens a small panel with three types, Transform, Container and Portal. After a type is chosen the pointer becomes a plus in that type's colour; a click on empty canvas makes a zone of the usual size and a drag makes one of any size, and the type's icon can also be dragged out.\n\nThe panel closes on a click elsewhere or Escape, but stays open while a type is chosen until the zone is made.",
      "position": {
        "x": -39.854,
        "y": 4.634,
        "z": 0.01
      }
    },
    {
      "ID": "Feature-reorder-a-gallery",
      "name": "Reorder a gallery",
      "type": "Feature",
      "properties": {
        "Area": "Pictures",
        "Where": "Edit node",
        "Shortcut": "Alt/Option+arrows",
        "Remembered": "Saved",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When the pictures of a node should tell a story in order, the person opens Edit node, goes to Gallery and drags a thumbnail, or selects it and presses Alt or Option with the left or right arrow. Apply changes takes over the new order, and the Detail panel then shows the pictures that way.",
      "position": {
        "x": 18.615,
        "y": -4.218,
        "z": 0.01
      }
    },
    {
      "ID": "Message-picture-not-uploaded",
      "name": "Picture not uploaded",
      "type": "Message",
      "properties": {
        "Area": "Pictures",
        "Where": "Canvas",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a picture is refused, the message says why: a file that is too large gets its own size named against the limit of 25 MB, a wrong file type gets the list of accepted types, and a damaged file is called unreadable. When several pictures are added at once, one message names how many were not uploaded and gives each reason once.",
      "position": {
        "x": 39.556,
        "y": -13.768,
        "z": 0.01
      }
    },
    {
      "ID": "Message-choose-what-to-copy-first",
      "name": "Choose what to copy first",
      "type": "Message",
      "properties": {
        "Area": "Editing",
        "Where": "Bottom dock",
        "Shortcut": "",
        "Remembered": "Not applicable",
        "Set in app": true
      },
      "size": [3.75, 1.5],
      "description": "When a source is loaded in Copy properties and nothing is chosen, a click on another node shows Choose what to copy first. Nothing is painted before a choice, so a stray click cannot change a node.",
      "position": {
        "x": 33.314,
        "y": -33.021,
        "z": 0.01
      }
    }
  ],
  "links": [
    {
      "node1": "Core Concept-0",
      "node2": "Core Concept-1",
      "name1": "connects",
      "name2": "is connected with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Core Concept-9",
      "name1": "can be added to",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Core Concept-8",
      "name1": "displays",
      "name2": "lives on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-1",
      "node2": "Core Concept-8",
      "name1": "displays",
      "name2": "is displayed in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "Core Concept-9",
      "name1": "can be added to",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Core Concept-7",
      "name1": "is part of",
      "name2": "contains more information in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Core Concept-3",
      "name1": "can belong to",
      "name2": "stores more information in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Core Concept-5",
      "name1": "define the look of",
      "name2": "is displayed based on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-1",
      "node2": "Core Concept-3",
      "name1": "can belong to",
      "name2": "stores more information in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-7",
      "node2": "Core Concept-1",
      "name1": "is listed in",
      "name2": "lists connections by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-4",
      "node2": "Core Concept-3",
      "name1": "get types from",
      "name2": "defines types of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-4",
      "node2": "Core Concept-5",
      "name1": "are defined in",
      "name2": "defines",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-4",
      "node2": "Core Concept-7",
      "name1": "is configured by",
      "name2": "configures",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-7",
      "node2": "Core Concept-3",
      "name1": "are displayed in",
      "name2": "displays",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-19",
      "node2": "Core Concept-10",
      "name1": "are switched by",
      "name2": "switches off and on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-66",
      "node2": "Core Concept-10",
      "name1": "include",
      "name2": "is simplest of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-67",
      "node2": "Core Concept-10",
      "name1": "include",
      "name2": "is more detailed of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-66",
      "node2": "Feature-67",
      "name1": "is more detailed than",
      "name2": "is simpler than",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-69",
      "node2": "Core Concept-10",
      "name1": "are chained using",
      "name2": "define evaluation of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-68",
      "node2": "Core Concept-10",
      "name1": "are grouped into",
      "name2": "groups",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-20",
      "node2": "Core Concept-10",
      "name1": "are widened by",
      "name2": "widens results of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-9",
      "node2": "Feature-49",
      "name1": "is a kind of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-49",
      "node2": "Core Concept-0",
      "name1": "can show a",
      "name2": "replaces the name on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-64",
      "node2": "Core Concept-9",
      "name1": "is added by",
      "name2": "adds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-64",
      "node2": "Core Concept-7",
      "name1": "has",
      "name2": "is a button in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-64",
      "node2": "Feature-50",
      "name1": "is filled by",
      "name2": "fills",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-63",
      "node2": "Core Concept-9",
      "name1": "includes",
      "name2": "are part of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-40",
      "node2": "Feature-38",
      "name1": "includes",
      "name2": "is one of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-41",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-44",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-42",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-43",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-45",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "Core Concept-8",
      "name1": "is filtered by",
      "name2": "affect nodes in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "Feature-21",
      "name1": "is option of",
      "name2": "have option",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-9",
      "node2": "Feature-51",
      "name1": "is a kind of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-51",
      "node2": "Core Concept-8",
      "name1": "can contain",
      "name2": "is on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-21",
      "node2": "Core Concept-7",
      "name1": "is filtered by",
      "name2": "filters connections in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-60",
      "node2": "Core Concept-1",
      "name1": "can be hidden as",
      "name2": "are a kind of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-59",
      "node2": "Core Concept-1",
      "name1": "gets arrows from",
      "name2": "add arrows to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-70",
      "node2": "Core Concept-1",
      "name1": "is labelled by",
      "name2": "label",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-41",
      "node2": "Feature-62",
      "name1": "is caused by",
      "name2": "causes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-62",
      "node2": "Feature-42",
      "name1": "causes",
      "name2": "is caused by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-39",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-65",
      "node2": "Core Concept-7",
      "name1": "displays",
      "name2": "is displayed in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Feature-37",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Feature-52",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-61",
      "node2": "Feature-43",
      "name1": "causes",
      "name2": "is caused by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-58",
      "node2": "Core Concept-7",
      "name1": "is refreshed by",
      "name2": "refresh",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-58",
      "node2": "Core Concept-8",
      "name1": "is animated by",
      "name2": "move nodes on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-15",
      "node2": "Core Concept-0",
      "name1": "is used for",
      "name2": "visualise concepts as",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-15",
      "node2": "Core Concept-1",
      "name1": "is used for",
      "name2": "visualize relationships between them with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-15",
      "node2": "Core Concept-3",
      "name1": "are used for",
      "name2": "add structured details to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-15",
      "node2": "Core Concept-7",
      "name1": "is used for",
      "name2": "when needed, display",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-16",
      "node2": "Core Concept-1",
      "name1": "is used for",
      "name2": "everything can be connected with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-16",
      "node2": "Core Concept-10",
      "name1": "bring",
      "name2": "filter the noise and focus on the important with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-16",
      "node2": "Core Concept-6",
      "name1": "bring",
      "name2": "is at your fingertips with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-16",
      "node2": "Core Concept-7",
      "name1": "brings",
      "name2": "by grouping information into",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-17",
      "node2": "Feature-56",
      "name1": "provide absolute",
      "name2": "of all data with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Feature-56",
      "name1": "can run",
      "name2": "can run through",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-55",
      "node2": "Feature-56",
      "name1": "can run",
      "name2": "can run through",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Core Concept-4",
      "name1": "is stored in",
      "name2": "contains array of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Core Concept-11",
      "name1": "contains array of",
      "name2": "is stored in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-1",
      "node2": "Core Concept-11",
      "name1": "contains array of",
      "name2": "is stored in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Core Concept-5",
      "name1": "is stored in",
      "name2": "contains array for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Core Concept-7",
      "name1": "has settings stored in",
      "name2": "stores settings for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-17",
      "node2": "Core Concept-11",
      "name1": "format contributes to",
      "name2": "store graphs locally in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-14",
      "node2": "Core Concept-0",
      "name1": "is an object in",
      "name2": "contains objects as",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-14",
      "node2": "Core Concept-3",
      "name1": "are objects details in",
      "name2": "stores object details in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-14",
      "node2": "Core Concept-4",
      "name1": "defines data types of",
      "name2": "defines data types in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-13",
      "node2": "Core Concept-1",
      "name1": "is followed in",
      "name2": "works by following",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-13",
      "node2": "Feature-38",
      "name1": "by using",
      "name2": "provide",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-13",
      "node2": "Core Concept-10",
      "name1": "contribute to",
      "name2": "controlling visual elements using",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-13",
      "node2": "Feature-58",
      "name1": "provide feedback on",
      "name2": "triggers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-13",
      "node2": "Core Concept-6",
      "name1": "provide",
      "name2": "using",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-76",
      "node2": "Core Concept-7",
      "name1": "is configured by",
      "name2": "configures",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-4",
      "node2": "Feature-76",
      "name1": "are stored in",
      "name2": "stores",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-44",
      "node2": "Core Concept-7",
      "name1": "offers",
      "name2": "is action in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Feature-57",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-57",
      "node2": "Core Concept-10",
      "name1": "are carried by",
      "name2": "carries",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-17",
      "node2": "Core Concept-4",
      "name1": "provide",
      "name2": "is controlled through",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-16",
      "node2": "Core Concept-5",
      "name1": "provide",
      "name2": "with custom interactive",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-16",
      "node2": "Core Concept-8",
      "name1": "provides",
      "name2": "by displaying context in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Visuals-71",
      "name1": "is shape of",
      "name2": "can be a",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Visuals-70",
      "name1": "is shape of",
      "name2": "can be a",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-71",
      "name1": "is a shape in",
      "name2": "offers shape",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-70",
      "name1": "is a shape in",
      "name2": "offers shape",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Visuals-72",
      "node2": "Core Concept-0",
      "name1": "has a",
      "name2": "places",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-72",
      "name1": "is part of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Visuals-73",
      "node2": "Core Concept-5",
      "name1": "are rendered by",
      "name2": "renders",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-65",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-66",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-67",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-69",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-55",
      "node2": "Core Concept-11",
      "name1": "is written by",
      "name2": "writes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Feature-54",
      "name1": "reads",
      "name2": "contains all data for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-68",
      "node2": "Feature-67",
      "name1": "is part of",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Core Concept-10",
      "name1": "select nodes by",
      "name2": "are filtered in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-58",
      "node2": "Feature-61",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-64",
      "node2": "Feature-85",
      "name1": "is another way of",
      "name2": "can also be done by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-51",
      "node2": "Feature-85",
      "name1": "places",
      "name2": "can be placed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-37",
      "node2": "Core Concept-10",
      "name1": "fade nodes with",
      "name2": "fades nodes hidden by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-39",
      "node2": "Core Concept-8",
      "name1": "is affected by",
      "name2": "affects",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-40",
      "node2": "Core Concept-8",
      "name1": "is affected by",
      "name2": "affects",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-82",
      "name1": "is a property of",
      "name2": "has",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-83",
      "name1": "is a property of",
      "name2": "has",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-86",
      "name1": "is property of",
      "name2": "has",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-41",
      "name1": "is an action on",
      "name2": "has action",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-42",
      "name1": "is an action on",
      "name2": "has action",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-43",
      "name1": "is an action on",
      "name2": "has action",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-48",
      "name1": "is an action on",
      "name2": "has action",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-47",
      "name1": "adds new",
      "name2": "is created by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-46",
      "node2": "Core Concept-1",
      "name1": "is created by",
      "name2": "adds new",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-87",
      "node2": "Core Concept-7",
      "name1": "is sorted by",
      "name2": "sorts connections in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-87",
      "node2": "Core Concept-4",
      "name1": "stores",
      "name2": "is stored in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Core Concept-0",
      "name1": "is a building block of",
      "name2": "is built from",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Core Concept-1",
      "name1": "is a building block of",
      "name2": "is built from",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Core Concept-8",
      "name1": "is the main area of",
      "name2": "draws graphs on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Core Concept-6",
      "name1": "are part of",
      "name2": "is worked with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Core Concept-11",
      "name1": "is the format of",
      "name2": "stores graphs as",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Core Concept-media-module",
      "name1": "is part of",
      "name2": "stores pictures in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Capability-13",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Capability-14",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Capability-15",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Capability-16",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Capability-17",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Capability-18",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Use Case-website-project",
      "name1": "showcases",
      "name2": "is shown in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Use Case-ukraine-war",
      "name1": "showcases",
      "name2": "is shown in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Use Case-82",
      "name1": "showcases",
      "name2": "is shown in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Use Case-agent-session",
      "name1": "showcases",
      "name2": "is shown in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Use Case-trial-of-humanity",
      "name1": "showcases",
      "name2": "is shown in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Feature-limits-and-quirks",
      "name1": "are limits of",
      "name2": "has",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "UI-landing-page",
      "name1": "is the start of",
      "name2": "starts at",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Core Concept-keyboard-shortcuts",
      "name1": "speed up",
      "name2": "is sped up by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-mindshare",
      "node2": "Visuals-73",
      "name1": "draws",
      "name2": "is drawn by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-18",
      "node2": "Core Concept-11",
      "name1": "is produced for",
      "name2": "produces",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-18",
      "node2": "Feature-54",
      "name1": "brings in",
      "name2": "feeds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-landing-page",
      "node2": "Feature-54",
      "name1": "starts on",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Message-upload-successful",
      "name1": "confirms",
      "name2": "confirms with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Message-upload-unsuccessful",
      "name1": "explains a failed",
      "name2": "reports problems with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Feature-automatic-first-arrangement",
      "name1": "follows",
      "name2": "can trigger",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Feature-model-name",
      "name1": "is set by",
      "name2": "sets",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-automatic-first-arrangement",
      "node2": "Visuals-72",
      "name1": "is computed by",
      "name2": "fills in missing",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-automatic-first-arrangement",
      "node2": "Strategy-concentric",
      "name1": "is used similarly in",
      "name2": "resembles",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Data model-graph-file-shapes",
      "name1": "are accepted by",
      "name2": "accepts one of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Data model-what-import-does-not-check",
      "name1": "is let through by",
      "name2": "lets through",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Message-upload-unsuccessful",
      "node2": "Data model-property-rules",
      "name1": "are enforced by",
      "name2": "names breaks of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Message-upload-unsuccessful",
      "node2": "Data model-data-types-dictionary",
      "name1": "is checked by",
      "name2": "names gaps in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-54",
      "node2": "Feature-save",
      "name1": "follows",
      "name2": "is followed by",
      "direction": 1,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-57",
      "name1": "requires",
      "name2": "enables",
      "direction": 1,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-share-link-to-the-file",
      "name1": "requires",
      "name2": "enables",
      "direction": 1,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-55",
      "name1": "follows",
      "name2": "is followed by",
      "direction": 1,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "UI-25",
      "name1": "sits above",
      "name2": "is framed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "UI-22",
      "name1": "sits beside",
      "name2": "is framed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "UI-right-dock",
      "name1": "docks panels beside",
      "name2": "is framed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "UI-bottom-dock",
      "name1": "docks tools below",
      "name2": "is framed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "Feature-camera",
      "name1": "looks at",
      "name2": "is viewed through",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "Core Concept-layout",
      "name1": "organises nodes on",
      "name2": "is organised with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "Core Concept-zones",
      "name1": "are drawn on",
      "name2": "can contain",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "UI-35",
      "name1": "appear on",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "UI-25",
      "name1": "groups",
      "name2": "are grouped in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "UI-22",
      "name1": "groups",
      "name2": "are grouped in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "Actions-78",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "UI-26",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "UI-28",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "Feature-undo-and-redo",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "Core Concept-history",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "UI-29",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "UI-30",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-25",
      "node2": "UI-31",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Core Concept-zones",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-copy-properties",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-arrange-nodes",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-movements",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-snap-to-node-guides",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-show-grid",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "UI-23",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-glow",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "UI-24",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-right-dock",
      "node2": "Core Concept-7",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-right-dock",
      "node2": "Feature-48",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-right-dock",
      "node2": "Feature-47",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-right-dock",
      "node2": "Feature-node-types-manager",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-right-dock",
      "node2": "Core Concept-history",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-right-dock",
      "node2": "Message-unsaved-changes-dialog",
      "name1": "guards panels in",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-bottom-dock",
      "node2": "Feature-copy-properties",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-bottom-dock",
      "node2": "Feature-movements",
      "name1": "dock in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "UI-context-menus",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-47",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-delete-nodes-and-links",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-duplicate-node",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-resize",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-send-to-zone",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-add-image",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-align",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Core Concept-keyboard-shortcuts",
      "name1": "are shown in",
      "name2": "teaches",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-shift-click",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-area-selection",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-clear-selection",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-38",
      "node2": "Feature-drag-to-move",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-camera",
      "node2": "Feature-39",
      "name1": "moves",
      "name2": "is moved by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-camera",
      "node2": "Feature-40",
      "name1": "moves",
      "name2": "is moved by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-camera",
      "node2": "Feature-43",
      "name1": "flies",
      "name2": "is flown by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-camera",
      "node2": "Feature-57",
      "name1": "stores",
      "name2": "is stored in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-camera",
      "node2": "Visuals-73",
      "name1": "provides",
      "name2": "is part of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-43",
      "node2": "Feature-44",
      "name1": "works like",
      "name2": "is like",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-42",
      "node2": "Core Concept-7",
      "name1": "is opened by",
      "name2": "opens",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-42",
      "node2": "Feature-shift-click",
      "name1": "extends",
      "name2": "is extended by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-area-selection",
      "node2": "Core Concept-10",
      "name1": "limit",
      "name2": "skips nodes hidden by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-drag-to-move",
      "node2": "Feature-snap-to-node-guides",
      "name1": "helps",
      "name2": "is helped by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-drag-to-move",
      "node2": "Visuals-72",
      "name1": "is changed by",
      "name2": "changes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-41",
      "node2": "Feature-60",
      "name1": "are followed by",
      "name2": "follows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-1",
      "node2": "Feature-45",
      "name1": "selects",
      "name2": "is selected with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-45",
      "node2": "Feature-delete-nodes-and-links",
      "name1": "uses",
      "name2": "prepares",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-7",
      "node2": "Feature-clickable-web-addresses",
      "name1": "appear in",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-7",
      "node2": "Feature-widen-the-detail-panel",
      "name1": "widens",
      "name2": "can be widened by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-83",
      "node2": "Feature-clickable-web-addresses",
      "name1": "come from",
      "name2": "may contain",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-7",
      "node2": "Feature-83",
      "name1": "is shown in",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-7",
      "node2": "Feature-50",
      "name1": "is shown in",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-76",
      "node2": "Message-unsaved-changes-dialog",
      "name1": "protects",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-detail-settings-data",
      "node2": "Feature-76",
      "name1": "is stored in",
      "name2": "stores",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-detail-settings-data",
      "node2": "Feature-87",
      "name1": "is stored in",
      "name2": "stores",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-4",
      "node2": "Data model-detail-settings-data",
      "name1": "is part of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-link-properties",
      "node2": "Core Concept-7",
      "name1": "can show",
      "name2": "can be shown in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-delete-nodes-and-links",
      "name1": "is an action on",
      "name2": "has action",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-duplicate-node",
      "name1": "is an action on",
      "name2": "has action",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-0",
      "node2": "Feature-65",
      "name1": "identifies",
      "name2": "has",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-1",
      "node2": "Feature-delete-nodes-and-links",
      "name1": "removes",
      "name2": "can be removed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-48",
      "node2": "Message-unsaved-changes-dialog",
      "name1": "protects",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-48",
      "node2": "Feature-resize-label-text-to-fit",
      "name1": "is set in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-48",
      "node2": "Feature-65",
      "name1": "is read-only in",
      "name2": "shows read-only",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-48",
      "node2": "Feature-86",
      "name1": "is changed in",
      "name2": "changes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-82",
      "node2": "Feature-resize-label-text-to-fit",
      "name1": "shrinks",
      "name2": "can be shrunk by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Visuals-node-size",
      "node2": "Feature-resize",
      "name1": "changes",
      "name2": "is changed with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Visuals-node-size",
      "node2": "Feature-copy-properties",
      "name1": "copies",
      "name2": "is copied by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-node-size",
      "name1": "is part of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-type-colour",
      "name1": "is part of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-hexagon",
      "name1": "is a shape in",
      "name2": "offers shape",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-star",
      "name1": "is a shape in",
      "name2": "offers shape",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-polygons",
      "name1": "is a shape in",
      "name2": "offers shape",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Visuals-default-look",
      "name1": "replaces missing",
      "name2": "falls back to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Feature-58",
      "name1": "animate",
      "name2": "are brought to life by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-5",
      "node2": "Feature-glow",
      "name1": "extends",
      "name2": "are extended by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-86",
      "node2": "Feature-node-types-manager",
      "name1": "defines",
      "name2": "is managed in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-86",
      "node2": "Core Concept-5",
      "name1": "are picked by",
      "name2": "picks",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-86",
      "node2": "Visuals-type-colour",
      "name1": "belongs to",
      "name2": "has",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-66",
      "node2": "Feature-86",
      "name1": "is selected by",
      "name2": "selects by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-node-types-manager",
      "node2": "Core Concept-3",
      "name1": "are defined in",
      "name2": "defines",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-node-types-manager",
      "node2": "Visuals-polygons",
      "name1": "bypass",
      "name2": "cannot set",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-52",
      "node2": "Feature-node-types-manager",
      "name1": "is opened from",
      "name2": "opens",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-52",
      "node2": "Feature-legend-filter",
      "name1": "is applied from",
      "name2": "filters by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-24",
      "node2": "Feature-52",
      "name1": "is opened by",
      "name2": "opens",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-52",
      "node2": "Visuals-type-colour",
      "name1": "is explained in",
      "name2": "explains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-glow",
      "node2": "Visuals-type-colour",
      "name1": "is spread by",
      "name2": "spreads",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-58",
      "node2": "Feature-reduce-motion",
      "name1": "replaces",
      "name2": "are replaced by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-58",
      "node2": "Feature-screen-reader-announcements",
      "name1": "accompany",
      "name2": "are accompanied by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-58",
      "node2": "Feature-62",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-screen-reader-announcements",
      "node2": "Message-arranged-n-nodes",
      "name1": "is one of",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-screen-reader-announcements",
      "node2": "Feature-keyboard-operation",
      "name1": "goes with",
      "name2": "go with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-keyboard-operation",
      "name1": "goes with",
      "name2": "go with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-whole-number",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-decimal-number",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-percentage",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-duration",
      "name1": "is data type of",
      "name2": "have data type",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-3",
      "node2": "Data model-property-rules",
      "name1": "govern",
      "name2": "follow",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-4",
      "node2": "Data model-data-types-dictionary",
      "name1": "is part of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-data-types-dictionary",
      "node2": "Core Concept-3",
      "name1": "are declared in",
      "name2": "declares",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-1",
      "node2": "Data model-link-properties",
      "name1": "belong to",
      "name2": "stores more information in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-link-properties",
      "node2": "Data model-data-types-dictionary",
      "name1": "declares",
      "name2": "are declared in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-67",
      "node2": "Feature-value-inputs-per-data-type",
      "name1": "offers pick values for",
      "name2": "gets pick values in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-whole-number",
      "node2": "Feature-value-inputs-per-data-type",
      "name1": "offers a range for",
      "name2": "gets a range in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-69",
      "node2": "Feature-value-inputs-per-data-type",
      "name1": "offers dates for",
      "name2": "gets dates in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-duration",
      "node2": "Feature-value-inputs-per-data-type",
      "name1": "offers a range for",
      "name2": "gets a range in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-46",
      "node2": "Feature-70",
      "name1": "are entered in",
      "name2": "asks for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-46",
      "node2": "Feature-59",
      "name1": "are set in",
      "name2": "asks for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "Actions-78",
      "name1": "is one of",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "Feature-legend-filter",
      "name1": "is one of",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "Feature-connections-filter",
      "name1": "is a kind of",
      "name2": "can also apply to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "UI-34",
      "name1": "lists",
      "name2": "are listed in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "UI-26",
      "name1": "starts",
      "name2": "start from",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-26",
      "node2": "UI-32",
      "name1": "is opened by",
      "name2": "opens",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-32",
      "node2": "UI-33",
      "name1": "is entered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-32",
      "node2": "Feature-69",
      "name1": "are chosen in",
      "name2": "asks for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-67",
      "node2": "Feature-value-inputs-per-data-type",
      "name1": "is chosen in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-connections-filter",
      "node2": "Data model-link-properties",
      "name1": "are filtered by",
      "name2": "filters by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-33",
      "node2": "Feature-68",
      "name1": "is named by",
      "name2": "names",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-34",
      "node2": "Feature-19",
      "name1": "works in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-34",
      "node2": "Feature-68",
      "name1": "is built in",
      "name2": "builds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-34",
      "node2": "Feature-20",
      "name1": "is set in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-34",
      "node2": "Feature-21",
      "name1": "is set in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-23",
      "node2": "Feature-37",
      "name1": "is opened by",
      "name2": "opens",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-20",
      "node2": "Feature-60",
      "name1": "are followed by",
      "name2": "follows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Data model-share-link-parameters",
      "node2": "Core Concept-10",
      "name1": "are carried in",
      "name2": "carry",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-57",
      "node2": "Data model-share-link-parameters",
      "name1": "are written into",
      "name2": "is written with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-snap-to-node-guides",
      "name1": "helps",
      "name2": "is helped by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-show-grid",
      "name1": "helps",
      "name2": "is helped by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-align",
      "name1": "is part of",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-distribute",
      "name1": "is part of",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-arrange-nodes",
      "name1": "is part of",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-movements",
      "name1": "replays",
      "name2": "is replayed with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Visuals-72",
      "name1": "is set by",
      "name2": "sets",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-planned-layouts",
      "name1": "would extend",
      "name2": "will grow with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-layout",
      "node2": "Feature-drag-to-move",
      "name1": "is part of",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-row",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-grid",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-concentric",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-line",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-sunflower",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-bin-pack",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-grouped",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Strategy-throw-spread",
      "name1": "is strategy of",
      "name2": "offers strategy",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Message-arranged-n-nodes",
      "name1": "reports",
      "name2": "announces",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-movements",
      "node2": "Feature-arrange-nodes",
      "name1": "drives",
      "name2": "use strategies of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-align",
      "node2": "Feature-distribute",
      "name1": "is paired with",
      "name2": "is paired with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-align",
      "node2": "Feature-shift-click",
      "name1": "prepares",
      "name2": "needs a selection from",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-show-grid",
      "node2": "Feature-snap-to-node-guides",
      "name1": "works alongside",
      "name2": "works alongside",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-history",
      "node2": "Feature-arrange-nodes",
      "name1": "is recorded by",
      "name2": "records",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-zones",
      "node2": "Zone-transform-zone",
      "name1": "is kind of",
      "name2": "has kind",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-zones",
      "node2": "Zone-container-zone",
      "name1": "is kind of",
      "name2": "has kind",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-zones",
      "node2": "Zone-portal-zone",
      "name1": "is kind of",
      "name2": "has kind",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Zone-transform-zone",
      "node2": "Feature-send-to-zone",
      "name1": "applies",
      "name2": "is reached by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Zone-transform-zone",
      "node2": "Core Concept-3",
      "name1": "are changed by",
      "name2": "changes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Zone-portal-zone",
      "node2": "Visuals-72",
      "name1": "is changed by",
      "name2": "changes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Zone-container-zone",
      "node2": "Feature-37",
      "name1": "is like the fade of",
      "name2": "fades nodes like",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-zones",
      "node2": "Feature-what-is-remembered",
      "name1": "lists as session-only",
      "name2": "are session-only in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-history",
      "node2": "Zone-transform-zone",
      "name1": "is recorded by",
      "name2": "records",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Feature-copy-properties",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Core Concept-history",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Feature-glow",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Actions-78",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-history",
      "node2": "Feature-undo-and-redo",
      "name1": "steps through",
      "name2": "is stepped through with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-undo-and-redo",
      "node2": "Message-undone-and-redone-notices",
      "name1": "follow",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-history",
      "node2": "Feature-copy-properties",
      "name1": "is recorded by",
      "name2": "records",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-history",
      "node2": "Feature-delete-nodes-and-links",
      "name1": "is recorded by",
      "name2": "records",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-history",
      "node2": "Feature-48",
      "name1": "is recorded by",
      "name2": "records",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-29",
      "node2": "Feature-save",
      "name1": "is triggered by",
      "name2": "triggers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Message-2",
      "name1": "confirms",
      "name2": "confirms with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Message-could-not-reach-the-server",
      "name1": "stops",
      "name2": "can fail with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-model-name",
      "name1": "is set at opening before",
      "name2": "keeps the",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-opening-a-saved-model",
      "name1": "uses the address made by",
      "name2": "creates the address for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-large-graphs",
      "name1": "is the limit of",
      "name2": "accepts up to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-large-graphs",
      "node2": "Message-this-project-is-too-large-to-save",
      "name1": "warns about",
      "name2": "can cause",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-picture-usage",
      "name1": "is recorded by",
      "name2": "records",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-what-is-remembered",
      "name1": "explains",
      "name2": "keeps part of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Message-no-data-available",
      "name1": "follows a missing",
      "name2": "prevents",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-30",
      "node2": "Feature-57",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-30",
      "node2": "Feature-share-link-to-the-file",
      "name1": "is offered by",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-30",
      "node2": "Message-link-was-copied",
      "name1": "confirms",
      "name2": "confirms with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-share-link-to-the-file",
      "node2": "Feature-open-access",
      "name1": "applies to",
      "name2": "comes with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-57",
      "node2": "Feature-what-is-remembered",
      "name1": "explains",
      "name2": "carries part of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-31",
      "node2": "Feature-55",
      "name1": "is triggered by",
      "name2": "triggers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-55",
      "node2": "Message-3",
      "name1": "confirms",
      "name2": "confirms with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-53",
      "node2": "Core Concept-4",
      "name1": "stores",
      "name2": "is stored in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-2",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-3",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-link-was-copied",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-36",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-undone-and-redone-notices",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-could-not-reach-the-server",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-uploads-are-paused",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-opening-a-saved-model",
      "node2": "Message-no-data-available",
      "name1": "is shown without",
      "name2": "avoids",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-limits-and-quirks",
      "node2": "Data model-what-import-does-not-check",
      "name1": "is one of",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-limits-and-quirks",
      "node2": "Feature-46",
      "name1": "has a limit in",
      "name2": "include fixed nodes on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-limits-and-quirks",
      "node2": "Feature-opening-a-saved-model",
      "name1": "has a limit in",
      "name2": "include no list for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-limits-and-quirks",
      "node2": "Strategy-grouped",
      "name1": "has a limit in",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-9",
      "node2": "Core Concept-media-module",
      "name1": "stores",
      "name2": "is stored by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Data model-picture-values",
      "name1": "are issued by",
      "name2": "issues",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Feature-reusing-a-picture",
      "name1": "relies on",
      "name2": "allows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Feature-picture-files-and-sizes",
      "name1": "are accepted by",
      "name2": "accepts",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Feature-upload-limits",
      "name1": "protect",
      "name2": "is protected by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Message-picture-unavailable",
      "name1": "stands in for pictures of",
      "name2": "shows when missing",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Feature-picture-ids",
      "name1": "are issued by",
      "name2": "issues",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "UI-privacy-page",
      "name1": "explains",
      "name2": "is explained on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "UI-media-console",
      "name1": "manages",
      "name2": "is managed in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Feature-picture-usage",
      "name1": "is tracked by",
      "name2": "tracks",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "Feature-picture-upload-through-the-api",
      "name1": "uploads to",
      "name2": "accepts uploads by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-media-module",
      "node2": "UI-28",
      "name1": "requires",
      "name2": "enables",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-28",
      "node2": "Feature-51",
      "name1": "is added with",
      "name2": "adds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-51",
      "node2": "Feature-add-image",
      "name1": "adds",
      "name2": "is also added with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-50",
      "node2": "Feature-remove-from-a-gallery",
      "name1": "removes from",
      "name2": "is trimmed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-50",
      "node2": "Feature-63",
      "name1": "play in",
      "name2": "can hold",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-50",
      "node2": "Feature-49",
      "name1": "is chosen from",
      "name2": "provides the",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-48",
      "node2": "Feature-remove-from-a-gallery",
      "name1": "is done in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-picture-ids",
      "node2": "Data model-picture-values",
      "name1": "are mostly",
      "name2": "are the normal",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-picture-files-and-sizes",
      "node2": "Message-36",
      "name1": "reports on",
      "name2": "can lead to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-upload-limits",
      "node2": "Message-uploads-are-paused",
      "name1": "reports",
      "name2": "trigger",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-media-console",
      "node2": "UI-library",
      "name1": "is a tab of",
      "name2": "has tab",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-media-console",
      "node2": "UI-never-used",
      "name1": "is a tab of",
      "name2": "has tab",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-media-console",
      "node2": "UI-clean-up",
      "name1": "is a tab of",
      "name2": "has tab",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-media-console",
      "node2": "UI-storage",
      "name1": "is a tab of",
      "name2": "has tab",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-media-console",
      "node2": "UI-audit-log",
      "name1": "is a tab of",
      "name2": "has tab",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-library",
      "node2": "Feature-picture-ids",
      "name1": "are copied from",
      "name2": "copies",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-picture-usage",
      "node2": "UI-never-used",
      "name1": "is filled by",
      "name2": "fills",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-picture-usage",
      "node2": "UI-clean-up",
      "name1": "is filled by",
      "name2": "fills",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-storage",
      "node2": "Feature-upload-limits",
      "name1": "are shown in",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Message-picture-unavailable",
      "node2": "Feature-49",
      "name1": "can be replaced by",
      "name2": "can replace",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Data model-graph-file-shapes",
      "name1": "are shapes of",
      "name2": "has",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Data model-data-types-dictionary",
      "name1": "is part of",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Data model-detail-settings-data",
      "name1": "is part of",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Feature-53",
      "name1": "is part of",
      "name2": "can contain",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-11",
      "node2": "Data model-picture-values",
      "name1": "are written in",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-56",
      "node2": "Feature-model-creation-through-the-api",
      "name1": "is one of",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-56",
      "node2": "Feature-picture-upload-through-the-api",
      "name1": "is one of",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-model-creation-through-the-api",
      "node2": "Data model-graph-file-shapes",
      "name1": "is sent in",
      "name2": "needs the persisted shape of",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-model-creation-through-the-api",
      "node2": "Feature-model-name",
      "name1": "can be set by",
      "name2": "sets freely",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-model-creation-through-the-api",
      "node2": "Feature-large-graphs",
      "name1": "limits",
      "name2": "accepts up to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-74",
      "node2": "Feature-41",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-74",
      "node2": "Feature-42",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-74",
      "node2": "Feature-43",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-74",
      "node2": "Feature-glow",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-75",
      "node2": "Core Concept-10",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-75",
      "node2": "Feature-19",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-75",
      "node2": "Feature-legend-filter",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-75",
      "node2": "Feature-movements",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-76",
      "node2": "Feature-20",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-76",
      "node2": "Feature-37",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-76",
      "node2": "Feature-41",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-77",
      "node2": "Zone-transform-zone",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-77",
      "node2": "Feature-copy-properties",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-77",
      "node2": "Feature-55",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-79",
      "node2": "Feature-drag-to-move",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-79",
      "node2": "Feature-align",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-79",
      "node2": "Feature-arrange-nodes",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-79",
      "node2": "Zone-portal-zone",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-79",
      "node2": "Zone-container-zone",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-80",
      "node2": "Feature-48",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-80",
      "node2": "Feature-64",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-80",
      "node2": "Feature-46",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Actions-80",
      "node2": "Feature-83",
      "name1": "achieves",
      "name2": "is done with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Feature-86",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Core Concept-3",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Data model-69",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Core Concept-layout",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Feature-legend-filter",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Feature-43",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Feature-57",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Core Concept-7",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-website-project",
      "node2": "Core Concept-9",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Core Concept-layout",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Visuals-node-size",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Feature-59",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Data model-link-properties",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Feature-legend-filter",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Feature-43",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Feature-57",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Core Concept-3",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-ukraine-war",
      "node2": "Feature-86",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Core Concept-layout",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Visuals-node-size",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Core Concept-1",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Feature-67",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Feature-legend-filter",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Feature-43",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Feature-57",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Core Concept-3",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Feature-86",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-82",
      "node2": "Feature-54",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Core Concept-layout",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Visuals-star",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Visuals-hexagon",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Core Concept-9",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Feature-67",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Feature-43",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Feature-54",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-agent-session",
      "node2": "Core Concept-4",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Feature-86",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Data model-whole-number",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Feature-67",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Core Concept-7",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Feature-legend-filter",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Feature-43",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Feature-57",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Core Concept-9",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Use Case-trial-of-humanity",
      "node2": "Core Concept-4",
      "name1": "is demonstrated in",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-undo-and-redo",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-delete-nodes-and-links",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-resize",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-45",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-shift-click",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-area-selection",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-47",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-46",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-48",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-snap-to-node-guides",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-align",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-distribute",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Core Concept-zones",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-add-image",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "UI-right-dock",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-85",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-60",
      "name1": "are demonstrated by",
      "name2": "demonstrates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Core Concept-keyboard-shortcuts",
      "name1": "speed up",
      "name2": "are sped up by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-landing-page",
      "node2": "UI-featured-use-case",
      "name1": "is shown on",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-landing-page",
      "node2": "UI-use-case-list",
      "name1": "is shown on",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-landing-page",
      "node2": "UI-template-cards",
      "name1": "is shown on",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-landing-page",
      "node2": "UI-api-tile",
      "name1": "is shown on",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-landing-page",
      "node2": "UI-your-data-box",
      "name1": "is shown on",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-your-data-box",
      "node2": "UI-visualize-button",
      "name1": "turns into a graph",
      "name2": "is turned into a graph with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-your-data-box",
      "node2": "UI-local-file-button",
      "name1": "fills",
      "name2": "is filled by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-your-data-box",
      "node2": "UI-example-button",
      "name1": "fills",
      "name2": "is filled by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-your-data-box",
      "node2": "Feature-54",
      "name1": "is fed by",
      "name2": "feeds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-your-data-box",
      "node2": "Message-upload-unsuccessful",
      "name1": "appears in",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-local-file-button",
      "node2": "Feature-model-name",
      "name1": "comes from",
      "name2": "gives the",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-local-file-button",
      "node2": "Core Concept-11",
      "name1": "is loaded by",
      "name2": "loads",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-local-file-button",
      "node2": "Message-this-file-cant-be-opened",
      "name1": "is shown by",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Capability-17",
      "node2": "UI-your-data-box",
      "name1": "contributes to",
      "name2": "manage information with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "UI-featured-use-case",
      "name1": "is picked from",
      "name2": "supplies",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "Use Case-website-project",
      "name1": "is listed in",
      "name2": "lists",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "Use Case-ukraine-war",
      "name1": "is listed in",
      "name2": "lists",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "Use Case-82",
      "name1": "is listed in",
      "name2": "lists",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "Use Case-agent-session",
      "name1": "is listed in",
      "name2": "lists",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "Use Case-trial-of-humanity",
      "name1": "is listed in",
      "name2": "lists",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "Message-graph-not-available-yet",
      "name1": "marks items in",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-template-cards",
      "node2": "Message-graph-not-available-yet",
      "name1": "marks items in",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-use-case-list",
      "node2": "Feature-graph-password",
      "name1": "protects graphs of",
      "name2": "opens graphs protected by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-template-cards",
      "node2": "Feature-graph-password",
      "name1": "protects graphs of",
      "name2": "open graphs protected by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-api-tile",
      "node2": "Feature-56",
      "name1": "are shown in",
      "name2": "gives examples for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-api-tile",
      "node2": "Feature-model-creation-through-the-api",
      "name1": "is shown in",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-api-tile",
      "node2": "Core Concept-4",
      "name1": "is explained from",
      "name2": "links to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-api-tile",
      "node2": "Feature-graph-password",
      "name1": "can be sent from",
      "name2": "mentions",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-58",
      "node2": "Feature-loading-animation",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-automatic-first-arrangement",
      "node2": "Feature-loading-animation",
      "name1": "is shown during",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-reduce-motion",
      "node2": "Feature-loading-animation",
      "name1": "is calmed by",
      "name2": "calms",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-arrange-nodes",
      "node2": "Message-arranging-your-graph",
      "name1": "is shown during",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-8",
      "node2": "UI-title-panel",
      "name1": "sits above",
      "name2": "is framed by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-title-panel",
      "node2": "UI-graph-info",
      "name1": "is opened from",
      "name2": "opens",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-title-panel",
      "node2": "Feature-model-name",
      "name1": "is shown in",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-title-panel",
      "node2": "UI-landing-page",
      "name1": "is reached from",
      "name2": "leads back to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-title-panel",
      "node2": "Feature-graph-password",
      "name1": "is marked in",
      "name2": "shows a lock for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-title-panel",
      "node2": "Message-changes-not-persisted",
      "name1": "appears from",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-graph-info",
      "node2": "Feature-model-name",
      "name1": "is edited in",
      "name2": "edits",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-graph-info",
      "node2": "Feature-53",
      "name1": "is shown in",
      "name2": "shows",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-graph-info",
      "node2": "Feature-delete-graph",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-graph-info",
      "node2": "Feature-save",
      "name1": "is recorded in",
      "name2": "shows the last",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Feature-graph-password",
      "name1": "protects",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Message-password-needed",
      "name1": "guards",
      "name2": "can ask with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Message-password-needed",
      "node2": "Message-wrong-password",
      "name1": "answers",
      "name2": "can end in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-graph-password",
      "node2": "Feature-open-access",
      "name1": "is limited by",
      "name2": "limits",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-graph-password",
      "node2": "Feature-delete-graph",
      "name1": "needs",
      "name2": "is needed for",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-delete-graph",
      "node2": "Feature-picture-usage",
      "name1": "decides what goes with",
      "name2": "removes pictures by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-save",
      "node2": "Message-changes-not-persisted",
      "name1": "warns about",
      "name2": "can leave behind",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-limits-and-quirks",
      "node2": "Feature-graph-password",
      "name1": "has a limit in",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-wrong-password",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-1",
      "node2": "Feature-edit-link",
      "name1": "changes",
      "name2": "is changed with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-edit-link",
      "node2": "Feature-70",
      "name1": "are changed in",
      "name2": "changes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-edit-link",
      "node2": "Feature-59",
      "name1": "are changed in",
      "name2": "changes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-edit-link",
      "node2": "Data model-link-properties",
      "name1": "are changed in",
      "name2": "changes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-edit-link",
      "node2": "Feature-60",
      "name1": "are set in",
      "name2": "sets",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-context-menus",
      "node2": "Feature-edit-link",
      "name1": "is offered in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-right-dock",
      "node2": "Feature-edit-link",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-apply-changes",
      "node2": "Feature-48",
      "name1": "is confirmed with",
      "name2": "confirms",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-apply-changes",
      "node2": "Feature-edit-link",
      "name1": "is confirmed with",
      "name2": "confirms",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-apply-changes",
      "node2": "Feature-76",
      "name1": "is confirmed with",
      "name2": "confirms",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-apply-changes",
      "node2": "Feature-node-types-manager",
      "name1": "is confirmed with",
      "name2": "confirms",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-apply-changes",
      "node2": "Feature-save",
      "name1": "is separate from",
      "name2": "does not replace",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-apply-changes",
      "node2": "Message-unsaved-changes-dialog",
      "name1": "warns about",
      "name2": "avoids",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-fill-small-nodes",
      "name1": "is on",
      "name2": "contains",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Feature-fill-small-nodes",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-39",
      "node2": "Feature-fill-small-nodes",
      "name1": "helps",
      "name2": "is helped by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-fill-small-nodes",
      "node2": "Feature-resize",
      "name1": "is blocked by",
      "name2": "can block",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-fill-small-nodes",
      "node2": "Feature-what-is-remembered",
      "name1": "lists as session-only",
      "name2": "is session-only in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-39",
      "node2": "Message-zoomed-out-as-far-as-it-goes",
      "name1": "marks the limit of",
      "name2": "stops with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-zoomed-out-as-far-as-it-goes",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-align-toolbar",
      "node2": "Feature-align",
      "name1": "is offered on",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-align-toolbar",
      "node2": "Feature-distribute",
      "name1": "is offered on",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-align-toolbar",
      "node2": "UI-save-selection-square",
      "name1": "sits beside",
      "name2": "has beside it",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-area-selection",
      "node2": "UI-align-toolbar",
      "name1": "appears after",
      "name2": "brings up",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-shift-click",
      "node2": "UI-align-toolbar",
      "name1": "appears after",
      "name2": "brings up",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-save-selection-square",
      "node2": "Feature-selection-toolbox",
      "name1": "is created by",
      "name2": "creates",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-bottom-dock",
      "node2": "Feature-selection-toolbox",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-selection-toolbox",
      "node2": "Feature-selection-filter",
      "name1": "comes from",
      "name2": "switches on",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-10",
      "node2": "Feature-selection-filter",
      "name1": "is one of",
      "name2": "include",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-34",
      "node2": "Feature-selection-filter",
      "name1": "is listed in",
      "name2": "lists",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-6",
      "node2": "Feature-selection-toolbox",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-selection-toolbox",
      "node2": "Feature-what-is-remembered",
      "name1": "lists as session-only",
      "name2": "is session-only in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-zones",
      "node2": "UI-zones-panel",
      "name1": "creates",
      "name2": "are created from",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "UI-zones-panel",
      "name1": "opens from",
      "name2": "opens",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-zones",
      "node2": "Feature-dock-a-zone",
      "name1": "keeps",
      "name2": "can be kept with",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-bottom-dock",
      "node2": "Feature-dock-a-zone",
      "name1": "docks in",
      "name2": "holds",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Zone-container-zone",
      "node2": "Feature-dock-a-zone",
      "name1": "takes nodes off the canvas of",
      "name2": "hides nodes when",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-dock-a-zone",
      "node2": "Feature-what-is-remembered",
      "name1": "lists as session-only",
      "name2": "is session-only in",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-toolbar-keys",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "Core Concept-keyboard-shortcuts",
      "node2": "Feature-save",
      "name1": "has shortcut in",
      "name2": "include",
      "direction": 0,
      "properties": {},
      "visibility": false
    },
    {
      "node1": "UI-25",
      "node2": "Feature-toolbar-keys",
      "name1": "gives keys to",
      "name2": "has keys from",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-22",
      "node2": "Feature-toolbar-keys",
      "name1": "gives keys to",
      "name2": "has keys from",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-copy-properties",
      "node2": "Message-choose-what-to-copy-first",
      "name1": "is shown by",
      "name2": "can show",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-copy-properties",
      "node2": "Core Concept-3",
      "name1": "are copied by",
      "name2": "copies",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-choose-what-to-copy-first",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-50",
      "node2": "Feature-reorder-a-gallery",
      "name1": "orders",
      "name2": "is ordered by",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-48",
      "node2": "Feature-reorder-a-gallery",
      "name1": "is done in",
      "name2": "offers",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "Feature-picture-files-and-sizes",
      "node2": "Message-picture-not-uploaded",
      "name1": "reports on",
      "name2": "can lead to",
      "direction": 0,
      "properties": {}
    },
    {
      "node1": "UI-35",
      "node2": "Message-picture-not-uploaded",
      "name1": "is one of",
      "name2": "includes",
      "direction": 0,
      "properties": {}
    }
  ],
  "visuals": [
    {
      "nodeType": "Core Concept",
      "shape": "circle",
      "borderColor": "#3d7bf5"
    },
    {
      "nodeType": "Capability",
      "shape": "hex",
      "borderColor": "#f5871f"
    },
    {
      "nodeType": "Use Case",
      "shape": "star",
      "borderColor": "#ec4fa8"
    },
    {
      "nodeType": "Feature",
      "shape": "rectangle",
      "borderColor": "#5cc64a"
    },
    {
      "nodeType": "UI",
      "shape": "rectangle",
      "borderColor": "#f2c014"
    },
    {
      "nodeType": "Actions",
      "shape": "rectangle",
      "borderColor": "#9b51e0"
    },
    {
      "nodeType": "Message",
      "shape": "rectangle",
      "borderColor": "#e5484d"
    },
    {
      "nodeType": "Data model",
      "shape": "rectangle",
      "borderColor": "#17b8c4"
    },
    {
      "nodeType": "Visuals",
      "shape": "hex[5]",
      "borderColor": "#808a1c"
    },
    {
      "nodeType": "Zone",
      "shape": "hex[8]",
      "borderColor": "#9c6b3c"
    },
    {
      "nodeType": "Strategy",
      "shape": "hex[12]",
      "borderColor": "#8b2e3c"
    }
  ],
  "dataTypes": {
    "Area": "typelist",
    "Where": "typelist",
    "Shortcut": "string",
    "Remembered": "typelist",
    "Set in app": "bool",
    "Page": "string",
    "Category": "typelist"
  },
  "detailView": [
    {
      "nodeType": "*",
      "own": "*",
      "others": []
    }
  ]
}
