Changes for version 0.002013 - 2026-10-04
- Specification
- A reminder in the Middleware section: a reference in a scope or an event is shared by every layer that receives it, and one that outlives the request (built at load time, closed over, a constant) by every request too; change only your own copy. Writing into a handed reference can leak one request's data into another's response.
- Documentation
- The PSGI, Building and Tutorial middleware examples send a new event instead of pushing onto the response's headers. The Cookbook gains a MIDDLEWARE section: changing a response on its way out, and reporting back to an outer layer through a reference seeded before calling inward.
Documentation
building frameworks and toolkits on PAGI
worked, runnable recipes for the PAGI protocol
how PAGI stays loop-agnostic, how not to block, and how a server binds to an event loop
coming to PAGI from PSGI
The base PAGI specification: application interface and core concepts
The PAGI server extension mechanism
The PAGI Lifespan protocol for startup and shutdown events
PAGI server and application-runner integration guidance
The PAGI TLS extension for reporting connection security in scope
PAGI message formats for HTTP, WebSocket, and SSE
Learn the PAGI protocol for async Perl web applications
What changed between sub-spec versions, and what to do about it
Modules
Perl Asynchronous Gateway Interface
Examples
- examples/01-hello-http/README.md
- examples/01-hello-http/app.pl
- examples/02-streaming-response/README.md
- examples/02-streaming-response/app.pl
- examples/03-request-body/README.md
- examples/03-request-body/app.pl
- examples/04-websocket-echo/README.md
- examples/04-websocket-echo/app.pl
- examples/05-sse-broadcaster/README.md
- examples/05-sse-broadcaster/app.pl
- examples/06-lifespan-state/README.md
- examples/06-lifespan-state/app.pl
- examples/07-extension-fullflush/README.md
- examples/07-extension-fullflush/app.pl
- examples/08-tls-introspection/README.md
- examples/08-tls-introspection/app.pl
- examples/11-job-runner/README.md
- examples/11-job-runner/app.pl
- examples/11-job-runner/lib/JobRunner/HTTP.pm
- examples/11-job-runner/lib/JobRunner/Jobs.pm
- examples/11-job-runner/lib/JobRunner/Queue.pm
- examples/11-job-runner/lib/JobRunner/SSE.pm
- examples/11-job-runner/lib/JobRunner/WebSocket.pm
- examples/11-job-runner/lib/JobRunner/Worker.pm
- examples/11-job-runner/public/css/style.css
- examples/11-job-runner/public/index.html
- examples/11-job-runner/public/js/app.js
- examples/12-utf8/README.md
- examples/12-utf8/app.pl
- examples/13-flow-control/README.md
- examples/13-flow-control/app.pl
- examples/14-periodic-events/README.md
- examples/14-periodic-events/app.pl
- examples/14-periodic-events/cpanfile
- examples/15-embedded-ioasync/README.md
- examples/15-embedded-ioasync/cpanfile
- examples/15-embedded-ioasync/server.pl
- examples/16-foreign-loop/README.md
- examples/16-foreign-loop/cpanfile
- examples/16-foreign-loop/server.pl
- examples/17-event-middleware/README.md
- examples/17-event-middleware/app.pl
- examples/17-event-middleware/cpanfile
- examples/18-bidirectional-websocket/README.md
- examples/18-bidirectional-websocket/app.pl
- examples/18-bidirectional-websocket/cpanfile
- examples/README.md
- examples/mini-framework/README.md
- examples/mini-framework/app.pl