probat

In planning · no release yet

One validator for many formats.

probat checks whether a file is valid: HTML, XML, e-invoices such as XRechnung and Peppol, data files and plain text. Pure Rust, no Java runtime — as a library, on the command line, in CI and for AI agents.

MITRustNo JVMpassed · failed · not_run
  • invoice.xml

    XRechnung 3.0 · schema, EN 16931, XRechnung rules

  • index.html

    HTML conformance, ARIA

  • feed.atom

    Atom against its RELAX NG schema

  • config.json

    syntax, duplicate keys, JSON Schema

  • README.md

    links, anchors, front matter

  • any file

    UTF-8, hidden and bidi characters

What it does

How it checks

Four layers, in order

A file passes through bytes, syntax, schema and rules. When a layer fails, the deeper ones are reported as not_run instead of piling up follow-up errors.

  • Bytes: valid UTF-8, byte order mark, line endings, invisible and bidi control characters.
  • Syntax and schema: well-formed and parseable, then RELAX NG, XSD or JSON Schema.
  • Rules: Schematron business rules such as EN 16931, XRechnung and Peppol, and your own rules.
How probat checks a file (planned)A file goes through four layers in order: bytes and encoding, syntax, schema, and rules such as Schematron business rules. Each layer reports passed, failed or not_run. When a layer fails, the deeper layers are reported as not_run instead of producing follow-up errors. The result is a report as text, JSON or SARIF, with an exit code for CI and AI agents.How probat checks a file (planned)File → BytesBytes → SyntaxSyntax → SchemaSchema → RulesRules → ReportFile – HTML, XML, e-invoice …FileHTML, XML,e-invoice …Bytes – encoding, hidden charactersBytesencoding, hiddencharactersSyntax – well-formed, parseableSyntaxwell-formed,parseableSchema – RELAX NG, XSD, JSON SchemaSchemaRELAX NG, XSD,JSON SchemaRules – Schematron, own rulesRulesSchematron, ownrulesReport – passed · failed · not_runReportpassed · failed ·not_run
How probat checks a file (planned)A file goes through four layers in order: bytes and encoding, syntax, schema, and rules such as Schematron business rules. Each layer reports passed, failed or not_run. When a layer fails, the deeper layers are reported as not_run instead of producing follow-up errors. The result is a report as text, JSON or SARIF, with an exit code for CI and AI agents.How probat checks a file (planned)File → BytesBytes → SyntaxSyntax → SchemaSchema → RulesRules → ReportFile – HTML, XML, e-invoice …FileHTML, XML,e-invoice …Bytes – encoding, hidden charactersBytesencoding, hiddencharactersSyntax – well-formed, parseableSyntaxwell-formed,parseableSchema – RELAX NG, XSD, JSON SchemaSchemaRELAX NG, XSD,JSON SchemaRules – Schematron, own rulesRulesSchematron, ownrulesReport – passed · failed · not_runReportpassed · failed ·not_run

Frequently asked questions

Can I use probat today?

Not yet. The project is in planning; this page describes the goal. The changelog will show the first release.

Why not a visual check of e-invoices?

Schema order, code lists and hundreds of Schematron rules cannot be seen by looking at a file. Receiving portals and Peppol access points run exactly these rules and reject invoices that fail.

Does probat send invoices?

No. probat validates files. Sending an invoice over the Peppol network or to a public-sector portal is a separate step.

Which formats come first?

Those the existing engines already cover: HTML, XML with RELAX NG and Schematron, and the byte-level text checks. E-invoices follow once XPath 2.0 and XSD validation are in place.

Which formats come first, and when.

Read the format roadmap