Pysar · MIT licensed · .NET 10

Describe your report once. Render it everywhere.

Pysar is a report engine for .NET: XAML markup or a fluent C# builder in, a vector PDF, bitmap pages, or a zoomable in-app viewer out — identical on Windows, macOS, Linux, Android, iOS and the browser.

Program.cs
var report = ReportBuilder.Create("Hello report")
    .WithPageFormat(new PageFormat { Margin = new Thickness(30) })
    .WithDetail(detail => detail.AddElement(new Text { Content = "Hello from Pysar" }))
    .Build();

await new SkiaReportRenderer().SavePdfAsync(report, "hello.pdf");

The same report on every device

Pick a UI framework and a target — every combination renders identical pages: same totals, same pagination, same zoomable viewer.

The Pysar viewer in a .NET MAUI app on iPhone 17 running iOS 26.4, showing the Revenue by Customer report at 49% zoom.
The Pysar viewer in a .NET MAUI app on a Pixel 9a emulator, showing the same Revenue by Customer report at 50% zoom.
The Pysar viewer in a .NET MAUI Mac Catalyst app, showing the Revenue by Customer report at 80% zoom with $971,320 total revenue across 104 orders.

.NET MAUI on Windows — screenshot on the way. The integration ships today; only this capture is pending.

Built for real, paginated documents

Bands, bindings and pagination that behave like a document engine — not a UI framework stretched to fit.

Two authoring styles

.rxaml markup for fixed-shape reports, the fluent builder for structure computed at runtime — same object model, can be mixed.

Real pagination

Detail rows slice across pages, headers repeat, page bands re-resolve per page, and PageNumber/PageCount reach your bindings.

Vector PDF output

Text stays selectable and sharp at any zoom — nothing is rasterised — plus bitmap page rendering at any scale.

Tiled viewer

One viewer control shared across every UI framework — only the visible region rasterises, so memory follows the viewport.

Compile-time validation

The source generator checks {Binding} paths and DataTrigger.Binding against x:DataType, for reports loaded at runtime too.

Data binding & triggers

{Binding}, string formats, value converters and DataTrigger for conditional formatting — resolved once, at build time.

Name at most three packages

Pysar always, Pysar.Xaml for .rxaml markup, and one platform package for your UI framework.

PackageResponsibility
PysarReports, bands, layouts, repeaters, styles, triggers, data binding, and the SkiaSharp measurement, pagination, rendering and PDF engine
Pysar.XamlDeclarative report markup: the runtime loader and the code-behind source generator
Pysar.ViewerFramework-neutral viewer logic: page geometry, zoom, tile planning and the tile cache (arrives transitively)
Pysar.Maui.NET MAUI integration: app-package assets, font registration, PDF export and sharing
Pysar.AvaloniaAvalonia integration: avares:// assets, font registration and the report view
Pysar.BlazorBlazor integration: the report viewer component, printing through the browser
Pysar.WpfWPF integration (Windows only): pack/manifest assets, font registration and the report view
Pysar.UnoUno Platform integration: embedded assets, font registration, the report view and printing

The same ReportView, everywhere

Every platform package exposes the same properties — Zoom, EffectiveZoom, PageSpacing — so the integration reads the same across your apps.

.NET MAUI

Android, iOS & Mac Catalyst

Avalonia

Desktop, mobile & web

Uno

Android, web & desktop

WPF

Windows only

Blazor

Runs in the browser

Editor tooling for Pysar

.rxaml syntax highlighting for Rider, VS Code and Visual Studio is free, forever. Pysar.Design is available for Rider on the JetBrains Marketplace as a paid plugin with a 30-day trial.