Data Journalist Agent: Transforming Data into Verifiable Multimodal Story
Data2Story
A data-journalist agent skill that turns any dataset into a verifiable, evidence-grounded multimodal story โ a self-contained HTML article where every sentence traces back to the data or source that justifies it.
What it does
https://github.com/user-attachments/assets/7a2e2b65-3289-431d-b06a-230252df8774
- Dataset โ finished article. Point it at a CSV, a folder of data, or a paper, and a fixed pipeline of seven roles produces a publishable HTML story end to end.
- Evidence-grounded. Every sentence and visual links back to its source. The pipeline emits a
viewer.htmlinspector where you can click any claim to see the data, code, or citation behind it. - Multimodal by default. Charts, images, video, audio, maps, and interactive elements โ chosen from the data's actual properties, not a fixed checklist. Media generation routes through OpenRouter.
- Verifiable. Each run writes to its own versioned project folder and snapshots the exact skill versions used, so every result can be traced and re-checked.
- Progressive disclosure. Each role's
SKILL.mdholds only its instructions; bulky reference material (output schemas, field rules, lookup tables) lives in that role'sreferences/folder as JSON and is loaded only when needed.
Two versions. The repository ships two peer skills under>skills/โ the richer, current build isdata2story-pro; the paper's reproducible version isdata2story.
| Skill | Invoke | What it is |
|---|---|---|
|data2story-pro|/data2story-pro| Improved version of data2story. Seeskills/data2story-pro/README.md. |
|data2story|/data2story| The paper's canonical 7-role pipeline. |
Updates
- [x] [2026.6] Version 0.1.0: Optimized visual effects.
- [x] [2026.6.9] Released the arXiv paper, GitHub repository.
- [x] [2026.5.11] Data2Story was accepted as a Spotlight paper at the ACM Conference on AI and Agentic Systems workshop.
Installation & usage
Data2Story is an agent skill. The orchestrator lives in skills/data2story/SKILL.md โ it works first-class with Claude Code, and equally with Codex, Cursor, Gemini CLI, and other agents.
- Set your API key. Media generation routes through OpenRouter by default:
export OPENROUTERAPIKEY=sk-or-...
- Run the skill on a dataset:
skills/data2story/ under ~/.claude/skills/, or run from inside this repo), then:
/data2story data/pickacard
- Codex / other agents โ open the repo and ask the agent to follow the orchestrator:
Read skills/data2story/SKILL.md and run the Data2Story pipeline on data/pickacard
- Open the output:
index.html(the finished article) andviewer.html(the evidence inspector).
Project structure
data2story-skill/
โโโ skills/
โ โโโ data2story/ the paper's canonical 7-role pipeline ยท /data2story
โ โโโ data2story-pro/ the extended 14-agent build ยท /data2story-pro
โ โ โ self-contained: its own README, package.json, example data/
โ โโโ frontend-design/ visual design system used by data2story
โ โโโ frontend-design-pro/ extended design system used by data2story-pro
โ โโโ dataviz-craft/ chart-craft recipes ยท data2story-pro helper
โ โโโ find-data/ dataset discovery & validation ยท data2story-pro helper
โ โโโ sparring-partner/ idea-to-topic ideation ยท data2story-pro helper
โโโ .claude-plugin/ marketplace.json ยท installs either skill
โโโ assets/ shared images
Inside each orchestrator, a role is a SKILL.md + a references/ folder (JSON schemas & lookup tables) + any scripts/ it runs โ e.g. designer/scripts/ (OpenRouter media tools), inspector/scripts/ (the verify.py / generate_viewer.py verifier), detective/scripts/ (media fetch helpers).
The virtual newsroom
Think of it as a small newsroom in a box. Each role reads what the previous one produced, then adds its own artifact โ a fixed pipeline that runs once, end to end.
| # | Role | What it does | Produces | |---|------|--------------|----------| | 1 | Detective | Researches external context โ domain background, history, why the data matters | detective.json | | 2 | Analyst | Exhaustively profiles the data โ distributions, correlations, trends, anomalies | analyst.json, code/*.py | | 3 | Editor | Decides the narrative โ what the article argues and which findings matter | editor.md, editor.json | | 4 | Designer | Chooses how to show each point โ charts, images, video, audio, interactives | designer.json, assets/ | | 5 | Programmer | Builds the final HTML, tagging every element with its source IDs | index.html | | 6 | Auditor | Fixes layout issues โ overlap, spacing, alignment โ without changing content | index.html (fixed), auditor.json | | 7 | Inspector | Verifies every sentence traces to its evidence; builds an interactive viewer | inspector.json, viewer.html |
flowchart TB
DATA[(dataset)]
subgraph plan [Plan and design] direction LR DET[Detective] -->|detective.json| ANA[Analyst] ANA -->|analyst.json + code| EDT[Editor] EDT -->|editor.md + editor.json| DES[Designer] end
subgraph build [Build and verify] direction LR PRG[Programmer] -->|index.html| AUD[Auditor] AUD -->|index.html| INS[Inspector] end
DATA --> DET DES -->|designer.json + assets| PRG INS -->|inspector.json + viewer.html| OUT([article + evidence viewer])
License
Released under the MIT License.
Acknowledgement
If you use Data2Story in your research, please kindly cite:
@article{data2story,
title = {Data Journalist Agent: Transforming Data into Verifiable Multimodal Stories},
author = {Lin, Kevin Qinghong and EI, Batu and Shi, Yuhong and Lu, Pan and Torr, Philip and Zou, James},
journal = {arXiv preprint arXiv:2606.11176},
year = {2026}
}