ReportWright
MIT licensed Get it

● Report designer · viewer · engine

Report PDFs that pass PDF/A and PDF/UA. No Chromium.

An MIT-licensed report designer, viewer and engine. It streams a million rows in about 320 MB. See the benchmarks →

Standards
PDF/A-2b, PDF/UA-1, both together (veraPDF passes)
Exports
PDF, Excel, Word, HTML, CSV, JSON, print
Streaming
exportPdfStream in Node: about 260 MB peak from 20,000 to 100,000 rows (measured)
Scale
50,000 rows → 1,112 pages in 1.6 s (Node, measured)
Fonts
Standard fonts: Helvetica, Times, Courier (not embedded: a 1.6 KB invoice)
Phone
First page in 5.1 s on Fast 3G with a 4× slower CPU (2,000 rows; measured)
Scripts
HarfBuzz shaping + bidi: Hindi, Arabic, Hebrew
Items
Grouped tables, pivot tables, merged cells, list, subreports, rich text, sparklines, data bars, bullets, TOC
Charts
14 types incl. combo, radar, candlestick, gauge, funnel; trend lines, reference bands, 12 palettes
Barcodes
49 symbologies, drawn as vectors
Interaction
Parameters, drill-down, drill-through, interactive sort, search
Embedding
Script tag or ES module in a Shadow DOM; React, Vue, Svelte, Angular wrappers
Reuse
Master reports, report part libraries, themes, layers
Migration
SSRS .rdl / .rdlc, ActiveReportsJS .rdlx-json, JasperReports .jrxml, BIRT .rptdesign (try your own file)
Server
Per-report permissions, audit log, OIDC and SAML sign-in (in the server app, not this static demo)

02

Render it on your machine

The stress report: a grouped table with a sparkline and a data bar on every row. Pick a size; the rows are downloaded as JSON and laid out right here, on the page's main thread.

—click to first page, incl. download
—render time the viewer reports (data + layout)
—pages
RowsPagesViewerWallRows / s
Your runs appear here.

The 1.6 s figure in the spec sheet is the engine in Node on a laptop. Your browser number depends on your device; nothing here is cached or precomputed.

Pick a row count to start.

03

Designer playground

The full designer, mounted with mountDesigner(). Drag items from the toolbox, edit expressions, switch to Preview. Save keeps your edits in this tab; nothing is uploaded.

The designer loads when you get here.

04

Embed it

The viewer and designer are one script or ES module. Thin wrappers for four frameworks (the framework is a peer dependency; nothing is bundled twice). Both packages are on npm: @reportwright/engine makes PDFs in Node, @reportwright/viewer runs in the browser.

npm i @reportwright/engine @reportwright/viewer


    

05

What it does today

From the project's status document. Everything listed runs and is covered by tests; the right-hand column is what it does not do yet.

Layout engine

Page bands, multi-column body, keep-together and keep-with-next, page breaks between groups, table of contents with final page numbers, galley (pageless) view. Pure JavaScript with no DOM, so the same code renders in the browser and in Node.

Data

JSON, CSV, REST, GraphQL, and SQL run on the server (SQLite, Postgres, MySQL). A response explorer finds the rows in an API response. Filters, sorts, lookups, nested data sets, report functions.

Interactivity

Parameters with sliders, ranges, date ranges, cascading lists and options from data. Collapsible groups whose totals and paging stay correct, click-to-sort headers, drill-through with a breadcrumb, document map, search.

Charts

Column, bar, line, area, pie, donut, scatter, bubble, radar, polar, candlestick, OHLC, gauge and funnel. Combo charts with a second axis, 100% stacked and range series, log axes, trend lines, moving averages, reference lines and bands, data-label templates, 12 palettes or your own colours.

Tables and pivots

Pivot tables with nested row and column groups, totals, % of total, row or column, and expand and collapse. Merged cells, recursive groups, body sections, tables wider than the page, items inside cells. Sparkline, data bar and bullet in cells; 49 barcode symbologies as vectors; rich text.

Reuse

Master reports with a content placeholder (masters can have masters). Report part libraries, inserted linked or as a copy, with typed properties. Themes chosen at run time, named styles, and layers for screen, print, export or the designer only.

Migration

Imports SSRS / Report Builder .rdl and .rdlc (RDL 2008, 2010, 2016): data sets, parameters, tablix, charts, subreports, actions, VB expressions. Imports ActiveReportsJS .rdlx-json. What changed is listed as notes.

Output

PDF with links and an outline, Excel, Word (real tables), HTML, CSV and JSON (the laid-out pages) from the viewer. On the server: every format by URL, batches, schedules with time zones, signed webhooks, API keys, and a pw CLI that renders and diff-tests reports in CI.

Designer

Smart guides, rulers, align and distribute, groups, sort and filter editors, table and matrix gallery, a pivot wizard, instant visuals, chart series and overlay editors, drag a data set to get a table, version history, an expression editor with completion.

Governance (server app)

Folders and permissions per report and folder for users and groups, enforced on every path. An append-only audit log of sign-ins, views, renders and exports. Single sign-on with OpenID Connect and SAML 2.0, IdP groups mapped to roles. Not part of this static demo.

Languages

Viewer UI in English, Hindi, Spanish, French, German, Japanese, Chinese, Portuguese (BR) and Arabic (right-to-left). Report text is shaped with HarfBuzz, with bundled Noto fallbacks for Devanagari, Arabic and Hebrew.

Not yet

  • SSRS maps and custom report items are not imported; custom code is kept as text; gauges are approximated.
  • Word export leaves charts out.
  • No two-factor sign-in and no SAML single logout.
  • Indic scripts other than Devanagari, and Thai, need an uploaded font.
  • The embed's first load is 1.8 MB; the 400 KB target is not met.
  • Batch output files go to one server's disk.
  • Non-English UI strings are machine translations.