One ecosystem.
Every format and protocol.
Stop gluing together forty unrelated packages. wireform gives you serialization, codegen, streaming, messaging, and lake-format analytics on a single, SIMD-accelerated core — with one consistent set of APIs across every format.
What's in the box
Every package draws on the same optimized core and the same annotation deriver. Pick one format or all of them — you only build what you import.
Derive once, serialize everywhere
Define your type once and add the formats you need. The same annotation vocabulary — field overrides, rename, map keys — drives every backend, so a pattern learned in one format carries straight over to the next.
data Person = Person { name :: !Text, age :: !Int }
deriving stock (Show, Eq, Generic)
deriving anyclass (ToMsgPack, FromMsgPack,
ToCBOR, FromCBOR,
ToYAML, FromYAML)Generate types from any IDL
Point wireform-gen at a schema file and get idiomatic Haskell — or use a Template Haskell splice and skip the CLI. No protoc binary, no generated files to commit.
-- Template Haskell: read the .proto at compile time
$(loadProto "proto/person.proto")
-- Or the wireform-gen CLI for 8 schema languages:
-- wireform-gen proto -i api.proto -o gen/
-- wireform-gen avro -i user.avsc -o gen/
-- wireform-gen thrift -i service.thrift -o gen/Real XML and HTML processing
A fast, spec-compliant XML parser with XPath queries and XSLT, and a full HTML5 tree builder with CSS selectors and a streaming rewriter.
-- CSS selectors on parsed HTML, like the browser
let headings = querySelectorAll doc "article.post > h2"
-- XPath-style queries over the XML DOM
let titles = query "//book/title" catalogAnalytics without leaving Haskell
Read and write Parquet, Arrow, and ORC. Query Iceberg, Delta, Hudi, and Lance tables through native readers with predicate pushdown and column projection. No Spark, no Python bridge, no extra runtimes.
-- Column projection + predicate pushdown, in pure Haskell
let iter = decodeProjectedFilteredIter
pf
(Just ["user_id", "event_type", "timestamp"])
(col "status" .== lit "active")Kafka and gRPC, built in
A full native Kafka client — producers, consumers, transactions, consumer groups — plus a Kafka Streams DSL. A from-scratch gRPC implementation with bidirectional streaming.
-- Produce, then process inside a transaction
withTransaction producer $ \tx ->
for_ events (produce tx "orders")Add wireform to your project
No external tools, no codegen binaries, no extra runtimes. One core, one deriver, forty-plus formats — all native Haskell.
Read the getting started guide →