Changes for version 0.002011 - 2026-09-30
- Specification
- Transport backpressure callbacks are flow-control signals, not an audit log of buffer changes. Servers MAY evaluate watermarks after immediate, non-blocking write attempts, so a transient high-water crossing that leaves the buffer below the high mark need not fire a callback pair. Once backpressure is engaged, draining below the low mark MUST release waiting sends and invoke armed on_drain callbacks, whether the drain happens through immediate or deferred writes.
- Remove the incorrect note that ASGI servers keep a connection alive after a post-completion exception; uvicorn closes it. The rule itself is unchanged: the server MAY close the connection.
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