After completing a research task that involved multiple steps (searches, API calls, browsing, analysis), generate an interactive visual report and return it as a link.
Activate this skill automatically when:
From the conversation, extract a structured JSON with this schema:
json
{
"title": "Short descriptive title of the research",
"subtitle": "One-line description",
"research_time": "Xm Ys",
"conclusion": {
"text": "2-3 sentence key finding",
"confidence": 0.0-1.0
},
"steps": [
{
"tool": "Web Search | API | Web Browse | Analysis | Synthesis",
"tool_label": "Display label for the tool",
"time_range": "start — end",
"query": "What was searched/called/analyzed",
"summary": "What was found/concluded",
"sources": [
{ "title": "Source name", "url": "https://...", "icon": "📄" }
]
}
],
"visualizations": [
{
"type": "line_chart | bar_chart | market_cards | world_map | news_cards | stat_cards | comparison_table | quote_block | key_points",
"section_title": "Section heading",
"data": {}
}
]
}
IMPORTANT: Do NOT use a fixed template. Analyze the research content and pick only the visualizations that make sense. Use this decision guide:
Research involves...Use these visualizationsTime-series data, trends, probabilitiesline_chart or bar_chartPrediction markets, odds, pricingmarket_cardsGeopolitics, regional impact, locationsworld_mapNews articles, media coveragenews_cardsKey metrics, statistics, KPIsstat_cardsComparing products, options, candidatescomparison_tableExpert opinions, notable quotesquote_blockSummarized takeaways, bullet pointskey_points
Rules:
stat_cards + news_cards is a safe default comboline_chart: Time-series data, trends, probability changes json
{ "title": "Chart Title", "y_format": "percent", "y_min": 0, "y_max": 100,
"x_labels": ["Label1", "Label2"],
"series": [{ "name": "Series Name", "values": [10, 20, 30] }] }
bar_chart: Categorical comparisons, rankings json
{ "title": "Chart Title", "y_format": "number",
"bars": [{ "label": "Category A", "value": 85, "color": "#00d2a0" },
{ "label": "Category B", "value": 62, "color": "#6c5ce7" }] }
market_cards: Prediction markets, pricing, comparisons json
[{ "name": "Market Name", "yes_price": 85, "no_price": 15, "volume": "128M", "change_7d": 3.2 }]
world_map: Geopolitical analysis, regional impacts json
{ "regions": [{ "id": "united_states|europe|east_asia|...", "name": "Display Name", "info": "Impact description" }] }
Valid region IDs: north_america, united_states, canada, mexico, south_america, europe, africa, russia, middle_east, east_asia, china, southeast_asia, australia
news_cards: Related news, source citations json
[{ "title": "Headline", "source": "Publisher", "date": "Mar 28, 2026", "sentiment": "positive|negative|neutral|warning", "tag": "Category", "url": "https://..." }]
stat_cards: Key metrics and statistics (use for any numerical highlights) json
[{ "label": "Total Volume", "value": "$4.2B", "change": "+12.5%", "trend": "up|down|neutral", "icon": "💰" }]
comparison_table: Side-by-side comparisons json
{ "headers": ["Feature", "Option A", "Option B"],
"rows": [["Price", "$10/mo", "$25/mo"], ["Users", "5", "Unlimited"]],
"highlight_col": 1 }
quote_block: Notable quotes from sources json
[{ "text": "The quote text here", "author": "Person Name", "role": "Title / Organization", "url": "https://..." }]
key_points: Bullet-point takeaways with icons json
[{ "icon": "✅", "title": "Point Title", "text": "Explanation of the point" }]
Save the JSON to a temp file, then run:
bash
node {baseDir}/scripts/generate-report.js --input /tmp/research-data.json --output /tmp/report.html
node {baseDir}/scripts/upload-report.js --file /tmp/report.html
The upload script automatically:
#key=...)Privacy guarantee: The URL fragment ( #key=...) is never sent to the server. Only the person with the complete URL can view the report.
Return the URL to the user as:
text
📊 Research Report Ready
[Title of Research](https://r.a2ui.me/r/xxxxx.html#key=yyy)
6 steps · 14 sources · 87% confidence
🔒 End-to-end encrypted — only this link can decrypt
If no upload credentials are set, the report saves locally to {baseDir}/output/. Inform the user:
text
📊 Research report saved locally:
file:///path/to/output/report.html#key=yyy
(Set A2UI_R2_BUCKET to enable cloud hosting at r.a2ui.me)
If the user explicitly wants a public (unencrypted) report, add --no-encrypt:
bash
node {baseDir}/scripts/upload-report.js --file /tmp/report.html --no-encrypt