diff --git a/AGENTS.md b/AGENTS.md
index 275c2ab4..34f2f96c 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -230,7 +230,6 @@ How most packages work, so the bullets below don't repeat it:
- `vp dlx skills add onmax/comark-ui` lists them beside comark-ui and installs the ones picked.
- Each installs alone, so it carries the syntax of the blocks it uses in `references/blocks.md` and links nothing outside its folder. Its `references/example.md` is a finished document.
- Each has a page in `docs/pages/skills/` that leads with that example rendered.
-- `skills/data-explorer` writes `report.json` instead of Comark: a shared template in `assets/` draws it as an interactive page, and `assets/page.html` is the one page: `scripts/build.mjs` checks `report.json`, fills the page's slots, inlines Vega when comark-ui is installed, and screenshots every tab, and an agent without Node fills the slots by hand. The page loads anything missing from jsDelivr, so `app.js` and `style.css` must keep working from `comark-ui/dist/skills/data-explorer/assets/` on npm. Its page links a live example on Drop instead of rendering one.
### Docs site
diff --git a/docs/pages/skills/data-explorer.md b/docs/pages/skills/data-explorer.md
deleted file mode 100644
index ad0d1b32..00000000
--- a/docs/pages/skills/data-explorer.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-title: Data explorer
-description: Your agent explores a dataset and turns what it finds into an interactive page of findings, graphs, matrices and tables, from one report.json.
-icon: layout-dashboard
-keywords: data, data science, dashboard, analytics, report.json, filters, charts, tables, heatmap, vega-lite
-tagline: "Hand your agent a dataset and get back what's in it: the findings, and the graphs and tables behind them, on a page you click through, filter and share."
----
-
-::skill{name="data-explorer"}
-::
-
-[Open the example](https://drop.vitehub.dev/d/qmjw7dwepwfa/who-builds-nuxt-dashboard): an agent built it with this skill from the public [Nuxters](https://github.com/nuxt/nuxters) data, in one run.
-
-## What it does
-
-The agent starts from the data, not the page. It writes down the questions you want answered, profiles every field, and computes every number in a prep script, so a rerun on new data rebuilds the page. Then it writes `report.json`: the data rows, the filters, and the blocks on each tab. A shared template draws it, so the agent writes no HTML, CSS or page script. Every page gets the same parts:
-
-- a **top bar** with the tabs and a light and dark theme
-- a **strip of numbers** that stays on every tab, and the **rows behind them** at the bottom
-- **flat sections** of charts, segmented bar lists, heatmap matrices and tables, two to a row
-- a **filter sidebar** with search, the period, and one list per entity, where every name keeps one color across the page and a click filters every block
-
-The build rejects text past its limits and names the fix, so the page stays numbers first. It then screenshots every tab in light and dark, and the first on a phone, and the agent reads each one before it hands the page back.
-
-The result is one HTML file. It opens from disk or any static host, and you can publish it to [Drop](https://drop.vitehub.dev/?utm_source=comark-ui&utm_medium=skills) to share it privately, with a new version on each rebuild and comments on the numbers.
-
-## When to use it
-
-Ask with the data in hand, such as "What does this export say about who contributes to our repos?" or "Make this CSV explorable by country and month." To be sure, say "Use the data-explorer skill."
-
-- You explore data and filter it yourself: this skill.
-- You choose between options or approve a plan: [Report](/skills/report).
-- Findings about something that already exists: [Review document](/skills/review-document).
-
-## What your agent needs
-
-Node with `playwright` installed, for the build that checks the page against its limits and screenshots it. With `comark-ui` installed too, the page carries Vega and opens offline. Without Node, as in a chat app, the agent fills the skill's page template itself, and the page loads whatever it couldn't fill, such as Vega, from jsDelivr when it opens.
-
-## It's working if
-
-- The first tab opens with two or three numbers that answer what you asked, each with one sentence.
-- Every tab mixes block types: a table, a matrix or a bar list next to its charts.
-- A name has the same color in the sidebar, the tables and the charts, and clicking it filters the page.
-- Definitions and caveats sit on the Method tab, not under every chart.
-- The agent hands back the screenshots it read and what the data couldn't answer.
diff --git a/docs/pages/skills/index.md b/docs/pages/skills/index.md
index 828cec9e..f36ae24c 100644
--- a/docs/pages/skills/index.md
+++ b/docs/pages/skills/index.md
@@ -14,7 +14,7 @@ tagline: Each skill teaches your agent one kind of document, what goes in it and
- A visible change needs proof on a pull request: [Before/after evidence](/skills/before-after-evidence).
- A review is done, and someone has to decide what to do: [Review document](/skills/review-document).
- Someone has to choose between options or approve a plan, from your research: [Report](/skills/report).
-- Someone hands over data and wants to see what's in it, with graphs and filters: [Data explorer](/skills/data-explorer).
+- Someone hands over data and wants a dashboard with graphs and filters: Drop's [data-explorer skill](https://drop.vitehub.dev/.well-known/skills/data-explorer/SKILL.md?utm_source=comark-ui&utm_medium=skills), since it writes an HTML page rather than Comark.
- Someone asked how a system, a flow, or a change works: [Visual explanation](/skills/visual-explanation).
- Someone needs to learn one concept and prove it: [Teach lesson](/skills/teach-lesson).
- Your agent needs a block's syntax, not a whole document: the [comark-ui skill](/guide/agents).
diff --git a/docs/pages/skills/report.md b/docs/pages/skills/report.md
index 9b028ea0..08008506 100644
--- a/docs/pages/skills/report.md
+++ b/docs/pages/skills/report.md
@@ -29,7 +29,7 @@ Choose by what you have:
- Options to compare, or a plan to approve: this skill.
- Findings about code, a design, or a system that already exists: [Review document](/skills/review-document).
- A question about how something works: [Visual explanation](/skills/visual-explanation).
-- Data you explore and filter yourself: [Data explorer](/skills/data-explorer).
+- Data you explore and filter yourself: Drop's [data-explorer skill](https://drop.vitehub.dev/.well-known/skills/data-explorer/SKILL.md?utm_source=comark-ui&utm_medium=skills).
## It's working if
diff --git a/skills/comark-ui/SKILL.md b/skills/comark-ui/SKILL.md
index 3339e654..87a224b7 100644
--- a/skills/comark-ui/SKILL.md
+++ b/skills/comark-ui/SKILL.md
@@ -53,7 +53,7 @@ Problems land in `meta.issues` after `parseMarkdown`, one sentence each, and a h
## Shape the document
-This skill teaches the blocks. Five sibling skills teach a whole document, what goes in it and in what order: `before-after-evidence`, `review-document`, `report`, `visual-explanation`, and `teach-lesson`. A sixth, `data-explorer`, builds an interactive data page from a `report.json` instead of Comark. When the user asks for one of those and it isn't installed, suggest `vp dlx skills add onmax/comark-ui` and picking it from the list.
+This skill teaches the blocks. Five sibling skills teach a whole document, what goes in it and in what order: `before-after-evidence`, `review-document`, `report`, `visual-explanation`, and `teach-lesson`. When the user asks for one of those and it isn't installed, suggest `vp dlx skills add onmax/comark-ui` and picking it from the list.
## Pick the blocks
diff --git a/skills/data-explorer/SKILL.md b/skills/data-explorer/SKILL.md
deleted file mode 100644
index 63776557..00000000
--- a/skills/data-explorer/SKILL.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-name: data-explorer
-description: Turns a dataset into an interactive explorer page, a dashboard of findings, graphs, matrices and tables behind tabs and filters. Use when someone hands over data, such as a CSV, a JSON export or an API, and wants to see what's in it, or asks for a dashboard of it.
-license: MIT
----
-
-# Data explorer
-
-A data explorer is one `report.json`: the data rows, the filters, and the blocks on each tab. This skill's template draws it as an _instrument_, the way an analytics tool looks: a top bar with the tabs, a strip of numbers that stays on every tab, flat sections of charts and tables, the rows behind the numbers at the bottom, and a filter sidebar on the right where every name keeps one color across the page. You decide **what to show**; the template owns **how it looks**. You write no HTML, CSS or page script.
-
-Words are the scarcest thing on the page. A reader scans numbers, colors and bars; prose goes in `method`. The build rejects text past its limit.
-
-When the reader has to choose between options or approve a plan, write a `report` instead: a page with the answer first.
-
-The block reference is [references/blocks.md](references/blocks.md); read it before step 3.
-
-## Steps
-
-1. **Questions.** From the request, write the 3 to 6 questions the reader wants answered. Each becomes a tab. Name each one's _shape_: change over time, share of a whole, ranking, two numbers per item, spread, two categories crossed, or a lookup of one item.
- Done when every question has a shape and none overlaps another.
-
-2. **Profile.** Write a short script that prints, for each source file, its row count, every field with its type, range and share of nulls, and a few sample rows. Read the source's README for what each field means and how it was counted.
- Done when you can name the fields and the join keys each question needs, and the caveats the README states.
-
-3. **Entities and filters.** Pick the one or two _entities_ the reader thinks in (customers, repositories, countries, types of work) and the period or mode they switch between. Each entity becomes a `list` filter: it gets a color that every block reuses, a row in the sidebar with its count, and a click target in every table and bar list. The period becomes a `tabs` filter. Give every dataset that should follow a filter that filter's column.
- Done when each entity and period is a filter and you know which datasets carry its column.
-
-4. **Prep.** Write `prep.py` (or `prep.mjs`) next to the report. It reads the raw files and writes `report.json` with aggregated rows: one dataset per block shape, plus one dataset of evidence rows (the people, tickets or items behind the numbers). Every number on the page is computed here, so a rerun on new data rebuilds the report. Fold any long tail into one `Other` row.
- Done when the script runs from scratch and prints the headline numbers you'll quote.
-
-5. **Blocks.** Put 4 to 6 numbers in `top` (a `stats` block) and the evidence rows in `bottom` (a `table` with `"style": "rows"`); both stay on every tab. On each tab, pick 2 to 6 blocks by the question's shape, using the table in [references/blocks.md](references/blocks.md), and mix them: a tab of only line charts reads as a chart dump, a tab with a table, a matrix and a bar list reads as an instrument. Open the first tab with a `facts` block: 2 or 3 numbers that answer the request, each with one sentence.
- Done when every block answers its tab's question and no two blocks show the same numbers.
-
-6. **Words, last.** Write a short product-like `title` and a `subtitle` (the source and the date range), a `title` per block that names what is measured, and a `note` only where a block would mislead without it or says how to use it ("Click a row to filter"). Definitions, caveats and how you counted go in `method`.
- Done when no block has a sentence the numbers already show.
-
-7. **Build and look.** Build the page as [Build it](#build-it) says, and fix every error the build prints; each one says how. Then look at it like a reader, in **every** screenshot (light, dark and phone), or without Node in your host's preview if it has one: labels collide or are cut, a block is empty or flat, colors disagree between blocks, a tab without a table or matrix, a fact the blocks don't support. Change the blocks or the prep, not the template.
- Done when the build exits 0 and you have opened every screenshot of the last build, or, without Node, when `report.json` keeps every limit and you have looked at the page.
-
-8. **Hand back** the path to `report.html`, the screenshot folder if you built with `--shots`, and three lines: what the report answers, the most surprising finding, and anything the data couldn't answer. The page is one file that opens from disk or any static host. When the reader wants to share it, publish it to [Drop](https://drop.vitehub.dev/?utm_source=comark-ui&utm_medium=skills): the link is private, a rebuild on new data becomes a new version at the same URL, and readers can comment on the numbers.
-
-## Build it
-
-The page is [assets/page.html](assets/page.html) with `report.json`, the template's [assets/style.css](assets/style.css) and [assets/app.js](assets/app.js) in its slots. Fill it the first way your environment allows:
-
-1. **With Node**, run the build. It checks `report.json` against every limit and names the fix, fills the page, and screenshots every tab. Copy this skill's `scripts/` and `assets/` folders next to the report, keeping them side by side, then:
-
- ```sh
- node scripts/build.mjs report.json report.html --shots shots
- ```
-
- `--shots` needs `playwright` installed where you run it; without the flag, the build needs nothing installed. The build finds both from the folder you run it in, so install them in a scratch folder with its own `package.json` (`pnpm add --ignore-workspace comark-ui playwright`) and run the build from there, with paths to `scripts/build.mjs` and the report. With `comark-ui` there too, the page carries Vega inline and opens offline. On Linux, when Playwright has no browser of its own version, the build uses the newest Chromium in `~/.cache/ms-playwright`.
-
-2. **Without Node**, such as in a chat app's sandbox, fill [assets/page.html](assets/page.html) yourself, with any language: `report.json` goes inside `
-
-
-
-
-