Prisma Logo Prisma v0.2.0
📊 Case Studies & Engineering Notes

Prisma Blog & Benchmarks

Real-world Erlang & Elixir library audits, performance benchmarks against Dialyzer, and deep-dives into abstract interpretation and type inference on OTP 29.

Case Studies benchmarks 2026-11-13 · Manuel Rubio OTP 29

Case Study & Modernization: ra (Raft for Erlang)

Replacing Dialyzer and Eqwalizer with Prisma: 15 contract bugs and 4 oxbow parameters resolved in RabbitMQ's consensus engine

In this case study, we examine the complete modernization of ra, the open-source Raft consensus engine implemented in pure Erlang by the RabbitMQ team at Broadcom. ra is the foundational core behind RabbitMQ Quorum Queues, Stream engines, and Khepri metadata coordination.With 55 BEAM modules coordinating complex distributed state machines, asynchronous write-ahead logs (WAL), snapshotting, and leader elections, ra is one of the most critical and battle-tested distributed systems libraries in the BEAM ecosystem.We replaced both Dialyzer and Eqwalizer with Prisma, eliminated over 250 lines of static-typing workarounds and stubs, generated portable .pplt contract tables, and resolved 15 contract bugs and 4 dead parameters caught by Prisma's hybrid analyzer. All changes have been submitted upstream in rabbitmq/ra#677.
Prisma Check
0.56s (0.65s CPU)
Dialyzer Check
16.50s (45.20s CPU)
Cache (.pplt vs .plt)
134 KB vs 102400 KB
True Warnings
19 vs 0
#erlang #dialyzer #eqwalizer #prisma #ra #rabbitmq #raft #static-analysis
Read full report
Type Systems internals 2026-11-11 · Manuel Rubio

How Prisma Reasons About Types and Verifies Correctness

Inside Prisma's hybrid type algebra, forward constraint inference, widening bounds, PropEr semantic proofs, and mutation benchmarks

After publishing Understanding Prisma PPLT, two sharp questions quickly came up on Erlang Slack—asking less about packaging and caching, and more about the heart of any static analyzer: what type reasoning does Prisma actually use, how does it ensure correctness, and does it handle modern OTP features like nominal types and native records?
#erlang #elixir #prisma #type-systems #gradual-typing #success-typing #proper #correctness #static-analysis #dialyzer
Read full report
Architecture internals 2026-11-10 · Manuel Rubio

Understanding Prisma PPLT: Anatomy, Architecture, and Why Dialyzer's PLT Needed a Reinvention

What PLT stands for, why Dialyzer's Persistent Lookup Tables struggle in modern workflows, and how Prisma PPLTs solve them

In the BEAM ecosystem, static typing and contract checking have long revolved around a central acronym: PLT, which stands for Persistent Lookup Table. Introduced over two decades ago with Dialyzer, the PLT was a breakthrough mechanism that enabled success typings to be saved on disk rather than recomputed from scratch on every run.Yet in today's software engineering reality—dominated by containerized CI/CD pipelines, package managers like Hex.pm, ephemeral build workers, and monorepos—Dialyzer's traditional PLT has become one of the most frustrating bottlenecks in Erlang and Elixir workflows.
#erlang #elixir #dialyzer #prisma #plt #pplt #static-analysis #type-systems #hex #packaging #architecture
Read full report
Benchmarks ephp 2026-11-09 · Manuel Rubio OTP 29

Case Study & Benchmark: ephp

Auditing a 49-module pure Erlang PHP interpreter: 59 bugs and contract discrepancies caught in 0.51s

In this third and culminating chapter of our ephp ecosystem audit series (following ezic and zucchini), we turn our attention to the core application itself: ephp, a 100% pure Erlang implementation of the PHP interpreter.With 49 BEAM modules spanning lexing, parsing, runtime stack management, memory and object heaps, and extensive standard library modules (pcre, date, math, file, string, spl), ephp represents a non-trivial, battle-tested Erlang codebase.This case study details the modernization of ephp 0.3.3, the removal of legacy dependencies, the benchmark against Dialyzer on OTP 29, and how Prisma uncovered 59 contract discrepancies and real runtime edge-case bugs that Dialyzer had ignored for years.
Prisma Check
0.51s (0.59s CPU)
Dialyzer Check
83.31s (285.90s CPU)
Cache (.pplt vs .plt)
132 KB vs 1446 KB
True Warnings
0 vs 0
#erlang #dialyzer #prisma #ephp #php #interpreter #benchmark #static-analysis
Read full report
Benchmarks ephp 2026-11-06 · Manuel Rubio OTP 29

Case Study & Benchmark: zucchini

Inferring exact AST types across leex and yecc parsers where Dialyzer goes blind

In this second case study of the ephp dependency audit series, we analyze zucchini, the Erlang INI file parser used by ephp to load php.ini configuration files. While small in module count (3 BEAM modules: zucchini, zucchini_lexer, and zucchini_parser), zucchini exposes a classic blind spot in Erlang static analysis: code generated by leex (lexical analyzer generator) and yecc (LALR-1 parser generator).
Prisma Check
0.18s (0.26s CPU)
Dialyzer Check
2.00s (2.43s CPU)
Cache (.pplt vs .plt)
5 KB vs 1446 KB
True Warnings
1 vs 0
#erlang #dialyzer #prisma #zucchini #ephp #leex #yecc #benchmark #static-analysis
Read full report
Benchmarks ephp 2026-11-05 · Manuel Rubio OTP 29

Case Study & Benchmark: ezic

Performance, CPU efficiency, and bug detection comparison between Prisma and Dialyzer

In this case study we analyze ezic, the IANA timezone handling library used by ephp. ezic is a particularly demanding and representative test case because it combines 10 core logic modules with 469 automatically generated modules (one for each timezone in the IANA database, plus link and map indexes), totaling 479 BEAM modules.
Prisma Check
2.31s (2.36s CPU)
Dialyzer Check
3.27s (13.61s CPU)
Cache (.pplt vs .plt)
64 KB vs 1433 KB
True Warnings
6 vs 2
#erlang #dialyzer #prisma #ezic #ephp #benchmark #static-analysis
Read full report