Changes for version 0.002012 - 2026-10-01
- Specification
- Clarify path, raw_path and root_path (Www 0.6). root_path followed by path is the path the client requested: whatever sets or extends root_path removes that prefix from path (PSGI's SCRIPT_NAME/PATH_INFO model; PAGI deliberately differs from ASGI, where path includes root_path). raw_path is the full requested path, percent-encoded, at every level: mounts leave it, a server root path is prepended. New section "Paths, Mounts and Root Paths": whole-segment prefixes, never strip a root path "only if present", root_path shape and trust, leading "//", and never authorize on raw_path. SSE scopes list raw_path, query_string and root_path among the keys they reuse. The PSGI mapping said PATH_INFO is "path minus root_path"; it is path, and REQUEST_URI is raw_path plus the query.
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