Escape
REPORTING FOR THE AGENTIC AGE

Agents draft the pages.
quario does the folding.

Reports are data, not code. An LLM drafts the definition; quario computes every number from your data and runs nothing the model writes.

Free to evaluate, no time limit · one license per production deployment · users, agents, and renders never counted
agent · quario-reports

Invoice for Acme — line items for the March work, total in dollars.

  1. validate_report2 problems
    • sort[0].dir: unknown sort direction "descending"
    • detail.columns[1].value [{{ round(@.qty * @.unitPrice }}]: Unexpected end of expression
  2. validate_reportrevised0 problems
  3. render_reportinvoice-1042.pdf
Invoice No. 1042
ItemAmount
TypesettingUS$1,440.00
Folding & gatheringUS$320.00
TotalUS$1,760.00

The model wrote the formula. The total came from the data.

Renders wherever JavaScript runs

  • Browser
  • Node
  • Edge
  • Workers
NO DESIGNER, NO SANDBOX

Three steps from a definition to a document.

  1. 01 · DEFINE

    An agent — or you — drafts JSON

    Sections, bindings, expressions. A format a model can write and a person can read.

  2. 02 · VALIDATE

    Check it before it renders

    plan() rejects a malformed definition and hands back every problem at its path.

  3. 03 · RENDER

    HTML, PDF, a workbook, or Word

    quario computes every total from your data, then renders it wherever JavaScript runs — browser, Node, edge, workers.

One definition, four document shapes.

The same definition gives HTML, PDF, a workbook, or Word.

@quario/html

A page

@quario/pdf

A PDF, no headless browser

@quario/xlsx

A workbook, numbers stay numbers

@quario/docx

A Word document, and Word paginates

SAFE BY CONSTRUCTION

Untrusted input by design.

An agent's output is untrusted, because a prompt injection can hide in it. Engines that compile templates run that output through eval. quario parses expressions into safe closures. It generates no code and evaluates none.

And the model never writes a number. It declares the formula for each figure, and quario computes it from your data. If the model picks the wrong formula, you'll see it in the definition — not buried in the output.

  • eval / new Function0 uses
  • numbers typed by the model0
  • script-src 'self' — strict CSPpasses
  • code injection via definitionimpossible by construction
  • markup in a definitionescaped as text
BUILT FOR TOOL CALLS

A reporting tool for agents.

Connect the quario MCP server, or register a tool of your own. The agent passes a definition and gets back every problem at the path it sits at, so it fixes the definition before anything renders.

The server's configuration stays yours: query budgets, link schemes, the data it may read and where it writes. Because the data comes from your side of the boundary, every figure traces back to your systems, not to the model.

  • MCP server
  • Skill
  • JSON Schema
  • llms.txt
Read the agent guide
→ validate_report  { definition }
← 2 problems
    sort[0].dir: unknown sort direction "descending"
    detail.columns[1].value [{{ round(@.qty * @.unitPrice }}]: Unexpected end of expression
→ validate_report  { definition }  revised
← {"problems":[],"warnings":[]}
→ render_report  { definition, target: "pdf", dataPath: "invoices/1042.json", filename: "invoice-1042" }
← Wrote invoice-1042.pdf (1.8 kB): /srv/reports/invoice-1042.pdf
Two problems, one retry, nothing rendered until it passed.
worker.ts · no agent required
import { quario } from 'quario'
import { pdf } from '@quario/pdf'
import definition from './reports/statement.report.json' with {
  type: 'json',
}

const q = quario({ locale: 'en-GB', currency: 'EUR' })
const report = q.report(definition)          // once, at startup

export async function renderStatement(accountId: string) {
  const data = await db.statements.forAccount(accountId)
  return report.render(pdf(), data)          // HTML · PDF · XLSX · DOCX
}
SDK FIRST

No agent required.

Compile a definition once and render it from a scheduled job, a queue worker, or an API route. The same definition gives HTML, PDF, a workbook, or Word.

If you know bands, groups, and running totals from classic report designers, you already know quario.

How quario lays out bands

Report templates for JavaScript

A growing set of production-ready quario reports. Each one is a declarative definition — copy it, point it at your data, and render to HTML, PDF, Excel, or Word.

All templates
BANDS WITHOUT THE BAGGAGE

Where it fits.

Safer than letting the model write HTML. Lighter than the heavyweight suites. More of a real engine than a PDF hack.

Heavyweight suites
The same banded model, without the designer runtime, per-server licensing, or eval in the template engine.
PDF hacks
Screenshot a webpage and hope. No structure, no bindings, no future.
Model writes HTML
The model types every number itself. Needs a sandbox, impossible to validate, different every run.
quario
The model declares, the engine computes. Validated before it renders, and safe by construction — whoever writes the definition.
COLOPHON

quario takes its name from the quarto and the quire — the folded sheet and the gathering of leaves that make a book. Whoever drafts the pages, quario does the folding.

quarto, a sheet folded into four leaves · quire, a gathering of folded sheets · ‑ario, a place that gathers. Net meaning: a place where pages come together.
PER DEPLOYMENT, NOT PER PERSON

Free to start.
Fair to ship.

Commercial software with readable source. Evaluate it free for as long as you like. License each production deployment when you ship, then let every user and every agent render without limit.

Agents and users are never counted. You license the deployment, not the people or the bots that use it.

Evaluation

$0
  • Full engine
  • no key
  • no time limit
  • every runtime
  • output carries a watermark
Getting started

Deployment

Per deployment/ year
  • Unlimited users, agents, and renders
  • unmarked output
  • development, staging, and CI free
  • annual, and the versions you paid for stay yours
See commercial terms