Tech Adoption Radar for Confluence
Tech Adoption Radar for Confluence is a Confluence Cloud app, built on Atlassian Forge, that renders a technology adoption radar (the four-quadrant, four-ring chart) from a blip list held in a macro. It provides three options for inputting radar content:
- Enter data in a table: Enter data directly into the table in the macro editor.
- Paste data: Paste data from a spreadsheet, CSV file or JSON file directly into the macro editor.
- Upload a file: Upload a CSV or JSON file to the macro editor.
The macro accepts the two common blip-list formats: the CSV convention of Thoughtworks' Build Your Own Radar (BYOR) and the radar.js JSON dialect of Zalando's tech-radar. Your data is stored on your Confluence page (data is never sent to Cloudscript.io or any third party) and the chart is drawn in the reader's browser when the page is viewed.
Adding a radar
Edit a Confluence page and insert the Tech Adoption Radar macro, either by typing /radar in the editor or by choosing it from the macro browser. (The macro is listed as Tech Adoption Radar in the editor; under an administrator's Manage apps it appears by its full name, Tech Adoption Radar for Confluence.) The macro editor opens on a table seeded with three example rows spanning three rings, three quadrants and three movement states, one of them carrying a description and a link. Replace the examples with your own technologies using one of the three methods described below, then save the macro and publish the page.
Enter Data in a Table
The macro editor opens in Table View. The upper Panel, titled Quadrant names & colours, defines the Radar's four quadrant names and colours and can be collapsed/expanded by clicking on the panel title. Below this panel, a table defines each blip on the radar.
Use the Quadrant names & colours panel to define Quadrant names via the name field, and to update quadrant colours via the dropdown for each quadrant. Each quadrant must have a unique name. Renaming a quadrant rewrites the quadrant of every row that used the old name in one pass.
Use the table directly below the Quadrant Panel to define a blip list containing your technologies. Each table row corresponds to one blip on the radar, with columns Name, Ring, Quadrant and Move. When specifying the Ring for a blip, choose from the dropdown containing options Adopt, Trial, Assess and Hold (these options cannot be modified by a user). Specify a Quadrant using the dropdown in this column, you can modify Quadrant names from the panel above the table. The Move column indicates if a blip's position on the radar is unchanged, new to the radar, moved inwards or moved outwards since the last edition (–, New, In, Out). Movement must be declared by the Radar author, rather than calculated from history. Each table row can be expanded (via the chevron at the start of the row) to allow a user to enter a multi-line Description and a Link to a same-site Confluence page. Where a description and link are provided, these are shown on the blip's hover card in the Radar. To remove a blip, delete a row via the bin icon at the end of the row. Use the + Add row option to create additional rows. Save with the Save button (or Cmd/Ctrl+Enter) and cancel with the Cancel button (or Escape).
Data entered into the table is saved in CSV format and can be viewed and edited as CSV by switching to Text View via the Text view (CSV/JSON) option in the top right hand corner of the macro editor. The Download CSV button (visible on both the Text View and Table View) allows you to download data entered into the table as a CSV file.
Pasting Data
Pasting Data: From a Spreadsheet
Most radars start life in a spreadsheet, so the macro editor accepts one directly. Select the required rows in your spreadsheet, copy them, and then paste anywhere in the macro editor. The tab-separated text that every spreadsheet places on the clipboard is recognised as a list rather than a single value, so your data will be automatically added to the correct rows and columns in the macro editor's table. A notice reports what happened (for example, "Pasted spreadsheet recognised — 12 rows added"). If the first row you copied is a header row naming name, ring and quadrant, columns are matched by header in any letter case and any order; otherwise the columns are read positionally as Name, Ring, Quadrant, isNew, Description, Status and Link. Pasting data over the example rows replaces them; pasting data into a list you have already edited appends the new rows after the existing ones in the order you copied them. A pasted ring or quadrant value that the radar does not recognise (for example, a ring called "Evaluate") is not remapped: data is retained but a message below the table indicates that the row "needs attention", and the radar will only render it once you have picked a value from the available dropdown options. A single copied value, with no tab and no line break, pastes into the focused cell as normal.
Pasting Data: radar.js JSON
To paste data in radar.js format, switch to Text View via the Text view (CSV/JSON) option in the top right hand corner of the macro editor and paste your JSON directly into the text field. You can also edit your pasted JSON to modify or append data in Text View. Data defined in JSON format can be viewed in a table by switching back to Table View but cannot be edited in Table View. To edit JSON data, switch back to Text View and edit the JSON content directly. If JSON data is pasted into an empty list or over the examples while in Table View, the JSON format is recognised and the macro editor switches to Text View to display the pasted JSON. JSON content cannot be appended to a list that already has content via pasting to Table View. To append additional content in JSON, switch to Text View and add to your existing JSON code instead. When data is provided in JSON format, a "Download JSON" option button is displayed in both Text View and Table View of the macro editor allows you to download the JSON data as a .json file.
Pasting Data: CSV format
CSV data with a header row can be pasted in either Table View or Text View; CSV without a header row should be pasted in Text View. Data pasted in CSV format can be edited as text in Text View or, more easily, by editing individual table cells in Table View. Your data can be downloaded as a CSV file via the Download CSV button available in both Table View and Text View of the macro editor.
Uploading Data
An Upload button in both Text View and Table View allows you to upload a file containing data. Files must be in .csv, .json, or .txt format. Data in CSV format will be displayed in Table View and data in radar.js JSON format will be displayed in Text View (regardless of which view it was uploaded from). Data in an uploaded file replaces any existing data. A file that does not contain a valid blip-list CSV or a valid radar.js list, or that is larger than 512 KiB is rejected and existing data is not overwritten.
Accepted Data Formats
CSV (BYOR convention)
A header row followed by one row per blip, in the convention used by Thoughtworks' open-source Build Your Own Radar (BYOR) tool. Headers are matched in any letter case and any order; name, ring and quadrant are required, the rest optional. Ring names are fixed at Adopt, Trial, Assess and Hold, with Caution accepted as the published alternative to Hold, and are matched in any letter case (the lowercase adopt of the BYOR convention is kept exactly as you wrote it, in the table and in the stored list); quadrant names come from the data, the first four distinct quadrant values in the file naming the radar's quadrants in that order. Any column not listed below is kept with the row in your data, but ignored by the chart when displaying the Radar.
| Column | Values | Notes |
|---|---|---|
name | text | Required. The blip's label in the legend and hover card. Two blips with the same name render as separate numbered entries. |
ring | Adopt, Trial, Assess, Hold (Caution) | Required. An unrecognised value leaves the blip out of the chart and lists it in the notes beneath it. |
quadrant | text | Required. The first four distinct values name the quadrants; any additional values are ignored and will be listed in the notes. |
isNew | TRUE, FALSE | Optional. TRUE marks the blip as new. Any other value is read as FALSE and noted. |
description | text | Optional. Blip descriptions are shown on the hover card for a Radar Blip and also included in the Word export table. Single line display only (any line breaks inside the description are rewritten as a space). |
status | New, Moved In, Moved Out, No Change | Optional. Overrides isNew when present. The table writes both columns so the file stays readable to tools that know only isNew. |
link | A link must be a same-site confluence path starting with a single / | Optional. Only same-site Confluence link such as /wiki/spaces/ENG/pages/98311/Terraform are displayed. External URLs are retained in your data but do not display in the Radar (see Blip links). |
JSON (radar.js dialect)
An array of entries, either bare or wrapped in a config object with an entries array, a title, and quadrants and rings name lists (each an array of { "name": "…" } objects, plain strings tolerated). Quadrants are numbered 0 to 3 clockwise from bottom-right and rings 0 to 3 inside-out, per the dialect. Each entry carries quadrant and ring as those indices, a label, a moved value (-1 moved out, 0 unchanged, 1 moved in, 2 new; a malformed value is placed as unchanged and noted), an optional link honoured under the same same-site rule as the CSV column, and an active flag that is carried but has no effect on the chart. The dialect has no description field, which is why a JSON list is edited as text.
{
"title": "Platform Radar",
"quadrants": [ { "name": "Languages" }, { "name": "Infrastructure" }, { "name": "Datastores" }, { "name": "Data Management" } ],
"rings": [ { "name": "Adopt" }, { "name": "Trial" }, { "name": "Assess" }, { "name": "Hold" } ],
"entries": [
{ "quadrant": 0, "ring": 0, "label": "Go", "moved": 0, "active": true },
{ "quadrant": 2, "ring": 2, "label": "ClickHouse", "moved": 2, "link": "/wiki/spaces/ENG/pages/98320/ClickHouse" }
]
}
The radar.js dialect comes from Zalando's open-source tech-radar project, so the title, quadrant and ring names, and entries of an existing Zalando radar carry across. Zalando's configuration is a JavaScript object passed to radar_visualization(), whereas the macro reads strict JSON: copy the object out and check that every key is in double quotes, with no comments and no trailing commas. Only title, the quadrants and rings names, and entries are read. Display settings (such as colors, the ring colours, width, height and font_family) are ignored without a note, because the macro draws with its own palette; set quadrant colours in the editor instead. Entry links follow the same-site rule above.
A list that violates the required format still renders where possible: every placeable blip is drawn, and a collapsed note beneath the chart (for example, "2 notes about this blip list") lists each row or entry the parser could not honour, with the reason, such as an unknown ring value or an empty name.
The CSV convention comes from Thoughtworks' Build Your Own Radar and the JSON dialect from Zalando's tech-radar. Tech Adoption Radar for Confluence is an independent product and is not affiliated with or endorsed by either project.
Downloading a file
Download hands back the stored list as a local file, named from the radar's title (migration-radar-blips.csv for a source titled "Migration Radar", or tech-adoption-radar-blips.csv when the source carries no title. A JSON list downloads verbatim as .json). Downloaded CSV files are neutralised against formula injection.
The 400-blip limit and the crowding warning
A radar can display a maximum of 400 blips. In Table View, the 400 limit is enforced during data entry (at 400 rows, "+ Add row" is disabled). Where data containing more than 400 blips is pasted or uploaded, data is truncated to its first 400 rows in the order they appear in your file, with a warning naming the limit and the number of rows discarded.
Below the 400 blip limit, a quadrant can still be too crowded to draw every blip without overlap. When this happens, the Radar displays a warning that names the affected quadrant and the number of blips not drawn, and the per-blip detail stays in the collapsed notes ("3 blips in Platforms are not shown: that area is too crowded to place them without overlap. They are numbered and named in the legend below."). The undrawn blips keep their numbers and appear in the legend.
Viewing the Radar
Blips are numbered by quadrant, ring and name, with numbering displayed on the Radar and blip status indicated by the shape of blip. A legend below the radar displays both blip name and status. Hovering a blip (or tapping it, on touch) opens a card with the blip's number, name, movement and description; Escape or tapping elsewhere dismisses it.
Confluence's page history can be used to track blip movement; for example, moving one technology from Trial to Adopt will be visible as an edit in the page history.
Where a blip contains a valid value in the Link field (the link column in CSV, the link field in JSON), the blip's hover card gains an Open in Confluence button. Clicking this button, or the blip itself, opens the target in a new tab. Links for blips are also keyboard-reachable (focus shows the card; Enter or Space opens the link).
Downloading an image of the radar
On the top right of the chart, the Download SVG and Download PNG buttons produce an image of the rendered radar that shows the chart, the movement key, the caption, and the numbered legend displaying blip names grouped by quadrant and ring exactly as seen on the Confluence page. The SVG is self-contained, with styles inlined; the PNG is rasterised at twice the chart's pixel dimensions. The filename is the radar's title as a slug (migration-radar.svg for a source titled "Migration Radar"), or tech-adoption-radar when the source carries no title.
Page exports (PDF, Word and Markdown)
Using Confluence's Export Page to PDF function exports your Confluence page with the rendered chart and legend as seen in your browser (the quadrant cards, the movement key and the numbered legend). Because the capture shows the chart rather than a data table, per-blip descriptions and link URLs (hover detail on the live page) do not appear in the exported PDF. If these are required, export the page to Word instead.
Confluence's Export to Word functionality does not export the Radar image, but instead displays your radar data as a table with all blip fields included. In the Word export, table cells are neutralised against formula injection so that it is safe to paste data from the exported Word table into a spreadsheet.
Confluence's Export to Markdown does not export the macro's table or the Radar. Where a Markdown copy of the list is needed, download the CSV from the macro editor, or export the page to Word and copy the table.
Known limitations
Word exports display a table, not a chart. The Word export contains the structured blip table as described above. An image of the chart is available via the on-page Download SVG and Download PNG buttons, and pasting one into a Word document is a manual step. Alternatively, exporting a Confluence page as a PDF can be used where a page export containing the chart is needed.
PDF exports contain the chart, but do not include hover details. The exported PDF shows the page at rest, so per-blip descriptions and link URLs (which the live page shows on hover) appear in the Word export's table but not in the PDF.
Markdown exports carry neither. See Page exports above; the CSV download (available from the macro editor) can be used to obtain a portable copy of the list.
Excel workbooks cannot be uploaded as a file. File Upload accepts .csv, .json and .txt only. To display a Radar from an Excel file, save a workbook as CSV from Excel before uploading. Rows from an Excel workbook can be pasted directly into the Table View of the macro editor, without converting the file to CSV first.
Ring names are fixed. The rings are Adopt, Trial, Assess and Hold (Caution accepted for Hold); a CSV using another ring vocabulary renders its blips only once the values are mapped to those four, which must be done per-row if editing from within the macro editor. Quadrant names are free-choice.
Links are same-site only. Only relative Confluence paths starting with a single / become live links; external URLs are preserved in the list but carry no behaviour on the Confluence page or in page exports.
Source size is capped at 512 KiB, whether uploaded, pasted or typed. Uploading files that exceed the size limit is blocked and the macro editor disables saving pasted or manually entered data over the size cap.
A radar displays a maximum of 400 blips, and a crowded quadrant may result in some blips not being visible on the chart. See the limit and the crowding warning above. Per-quadrant zoom is not offered in the current release.
Error messages
When the macro cannot draw a chart from the data provided, it shows a card on the page naming what happened:
- Empty. "No radar blip list yet." invites you to edit the macro; the macro editor opens on the example rows.
- Unreadable. "This blip list couldn't be read." with a hint naming both accepted formats and their required shapes. In the macro editor, an unreadable list opens as text with the same hint.
- Partly readable. The chart renders, and the collapsed notes beneath it list each unplaceable row or entry with the reason.
- Over the size cap. "This blip list exceeds the size limit." with the source's size and the 512 KiB limit.
- Too many blips. A card naming the count, the 400-blip limit, and the list's per-quadrant breakdown, suggesting the list be split across pages or trimmed to the blips under review.
- Internal error. "The renderer hit an unexpected problem." with the underlying message.
The unreadable and internal-error cards carry the rendering engine's version in a small footer. Please quote this if you need to contact support.
Security and privacy
The macro runs as a Custom UI app inside its own sandboxed iframe: the blip list is parsed and the chart drawn in the viewer's browser, and no blip data is sent to Cloudscript.io or any third party. The app requests no Confluence permissions (the manifest declares scopes: []), declares no external network destinations, keeps no storage of its own, and runs no analytics. The blip list, the optional format override and the colour selections are stored as the macro's parameters inside your own Confluence page content, governed by ordinary page permissions, page history and Confluence's own data lifecycle.
The editor's file and clipboard handling stays inside the browser as well. An uploaded file is read with the browser's own file reader and checked against the size cap before its contents can touch the list; an Excel workbook is recognised by its extension and its file signature and refused without being parsed. Spreadsheet paste prefers the plain tab-separated text the clipboard carries, and falls back to the clipboard's HTML table only when no usable text is present, parsing it as an inert document from which only cell text is read, so no script in a pasted table can run. Names and descriptions entering by any route (typed, pasted or uploaded) are neutralised on render and on export exactly as before: HTML in a label is inert, and bidirectional and zero-width characters are neutralised in display.
Full detail can be found in the app's Privacy Policy, and our broader approach is described in the Security Policy and Trust Center.
Release history
- Tech Adoption Radar 2.5: build a radar in a table Version 2.5
- Tech Adoption Radar for Confluence: a tech radar from a pasted blip list Version 2.2
Announcements for every app are on the News page.
Legal
Terms and privacy specific to this app: