Use case · Extraction primitive
Extract any table → CSV
Point Dornick at any HTML table — your CRM, an admin grid, a wiki, a third-party SaaS — and have it return clean CSV. Universal table extractor via the dornick.extract() primitive.
dornick.extract()PageMountschema validation
Try it live → Run the table-extract demo — point Dornick at a mock invoice table.
The shape
Your CRM exports tables as PDF. Your admin tool has a “download CSV” button
that crashes on 10K rows. Your team copy-pastes from Excel grids. Dornick’s
extract primitive solves this in 10 lines.
Code
import { Dornick } from "@dornick/core";
const dornick = new Dornick({
transport: { mode: "browser", provider: "anthropic", apiKey: "..." },
});
const rows = await dornick.extract({
selector: "table.invoices",
schema: {
invoice_id: "string",
customer: "string",
amount_usd: "number",
due_date: "date",
status: "enum: paid|pending|overdue",
},
});
// rows is a typed array. Pipe to CSV, save, ship.
Why this works
dornick.extract() is a thin wrapper over the agent loop with a constrained
output schema. The model reads the DOM, sees the table, and returns rows that
match your schema. Dornick validates against the schema — if a row doesn’t fit,
it’s flagged for review.
When it shines
- Legacy admin tools that don’t export.
- SaaS tables in tabs you don’t own (paired with
@dornick/extension). - Sales-ops batches — extract from 50 pages, dedupe, hand to ops.
- Audit trails — extract the page state at a moment, persist as CSV.
Dornick.act() and dornick.observe()
The same primitive family includes:
dornick.act(prompt)— let the agent take actions on the page (click, fill).dornick.observe(question)— ask a question about the current page.dornick.extract(schema)— pull structured data out.
These are the Playwright primitives, but user-side: the user owns the browser and consents. They’re useful when you don’t need a full chat — just one shot of agent work.
Runnable example: https://github.com/neul-labs/dornick/tree/main/examples/extract-anywhere
FAQ
Does this work on tables in iframes?
Only same-origin iframes. Cross-origin iframes can't be read from the parent due to browser security.
What about virtualized grids (e.g., AG-Grid)?
Yes — Dornick scrolls the grid to materialize all rows. Configurable via the scrollDepth option.
Ship an agent-driven flow this afternoon.
Install Dornick, paste a config, and your form turns into an agent that fills its own inputs.